gpt4 book ai didi

r - data.table 如何从 j 中获取列名?

转载 作者:行者123 更新时间:2023-12-04 17:35:36 25 4
gpt4 key购买 nike

例如:

dt <- data.table()
x=1:5
> dt[,list(2,3,x)]
V1 V2 x
1: 2 3 1
2: 2 3 2
3: 2 3 3
4: 2 3 4
5: 2 3 5

结果 data.table 有列 x
出于某种原因,我想创建一个函数来简化 data.table 的构造。
tt <- function(a, b, ...){
list(a=sum(a), b=sum(b), ...)
}

> dt[,tt(1:2,1:3,x)]
a b V3
1: 3 6 1
2: 3 6 2
3: 3 6 3
4: 3 6 4
5: 3 6 5

所以每当我打电话 list , 我用 tt相反,它会自动为我插入预定义的列。
但是,现在它无法识别 x 的快捷方式命名。 .

如何改进 tt自动命名列,如 list在 data.table 中是否不太难?

目的
dt[,tt(1:2,1:3,x)]

退货
   a b  x
1: 3 6 1
2: 3 6 2
3: 3 6 3
4: 3 6 4
5: 3 6 5

解决方案
tt <- function(a, b, ...){
dots <- list(...)
inferred <- sapply(substitute(list(...)), function(x) deparse(x)[1])[-1]
if(is.null(names(inferred))){
names(dots) <- inferred
} else {
names(dots)[names(inferred) == ""] <- inferred[names(inferred) == ""]
}
c(a=sum(a), b=sum(b), dots)
}

dt <- data.table(c=1:5)
x=1:5

> dt[,tt(1:2,1:3,x,c+1)]
a b x c + 1
1: 3 6 1 2
2: 3 6 2 3
3: 3 6 3 4
4: 3 6 4 5
5: 3 6 5 6
> dt[,tt(1:2,1:3,x, z=c+1)]
a b x z
1: 3 6 1 2
2: 3 6 2 3
3: 3 6 3 4
4: 3 6 4 5
5: 3 6 5 6

更新

最近我发现 Venables & Ripley 的 S Programming 的第 46 页中有一些错误。我做了一些修改并放在这里。希望它对某些人有用。
# Get the best names vector for arguments like what data.frame does.
# Modified from page 46 of S Programming from Venables & Ripley.
# http://stackoverflow.com/questions/20545476/how-does-data-table-get-the-column-name-from-j
name.args <- function(...){
# Get a list of arguments.
dots <- as.list(substitute(list(...)))[-1]
# Get names of the members if they have, otherwise "".
# If a list have no named members, it returns NULL.
nm <- names(dots)
# If all arguments are named, return the names directly.
# Otherwise it would cause a problem when do nm[logic(0)] <- list().
if (!is.null(nm) && all(nm != ""))
return(nm)
# Handle empty argument list case.
if (length(dots) == 0)
return(character(0))
# Get positions of arguments without names.
fixup <-
if (is.null(nm))
seq(along=dots)
else
nm == ""
dep <- sapply(dots[fixup], function(x) deparse(x)[1])
if (is.null(nm))
dep
else {
nm[fixup] <- dep
nm
}
}

# Example
# x <- 1:2
# name.args(x, y=3, 5:6)
# name.args(x=x, y=3)
# name.args()

最佳答案

一个简单的解决方案是将附加参数作为命名而不是未命名参数传递:

dt[,tt(1:2,1:3,x=x)]   ## Note that this uses `x=x` rather than just `x`
# a b x
# 1: 3 6 1
# 2: 3 6 2
# 3: 3 6 3
# 4: 3 6 4
# 5: 3 6 5

或者对于真正懒惰的人来说,像这样;)
tt <- function(a, b, ...){
dots <- list(...)
names(dots) <- as.character(substitute(list(...))[-1])
c(a=sum(a), b=sum(b), dots)
}
dt[,tt(1:2,1:3,x)]
# a b x
# 1: 3 6 1
# 2: 3 6 2
# 3: 3 6 3
# 4: 3 6 4
# 5: 3 6 5

关于r - data.table 如何从 j 中获取列名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20545476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com