gpt4 book ai didi

r - 使用 `:=` 语法以编程方式生成要分配给 data.table 的列列表

转载 作者:行者123 更新时间:2023-12-04 09:52:15 25 4
gpt4 key购买 nike

data.table ,我可以使用 `:=` 生成立即分配给表的新列的列表。语法,像这样:

x <- data.table(x1=1:5, x2=1:5)
x[, `:=` (x3=x1+2, x4=x2*3)]

或者,我可以执行以下操作:
x[, c("x3","x4") := list(x1+2, x2*3)]

我想做类似于第一种方法的事情,但是使用自定义函数自动构建赋值语句的右侧。例如,假设我想要一个接受一组列名的函数,然后生成作为给定列均值的新列,列名等于原始列加上一些后缀。例如,
x[, `:=` MEAN(x1,x2)]

将产生相同的结果
x[, `:=` (x1_mean=mean(x1), x2_mean=mean(x2))]

这在 data.table 中是否可行? ?我意识到,如果我愿意像 c("x3","x4") := ... 那样传入列名列表,这是可能的。例如,但我想避免这种情况,所以我不必编写那么多代码。

最佳答案

只需按名称引用函数:

myfun <- "mean"
x[,paste(names(x),myfun,sep="_"):=lapply(.SD,myfun)]
# x1 x2 x1_mean x2_mean
# 1: 1 1 3 3
# 2: 2 2 3 3
# 3: 3 3 3 3
# 4: 4 4 3 3
# 5: 5 5 3 3

定制很简单:
divby2 <- function(x) x/2 # custom function
myfun <- "divby2"
mycols <- "x1" # custom columns
x[,paste(mycols,myfun,sep="_"):=lapply(.SD,myfun),.SDcols=mycols]
# x1 x2 x1_mean x2_mean x1_divby2
# 1: 1 1 3 3 0.5
# 2: 2 2 3 3 1.0
# 3: 3 3 3 3 1.5
# 4: 4 4 3 3 2.0
# 5: 5 5 3 3 2.5

我们可能有一天会使用类似 paste(.SDcols,myfun,sep="_"):=lapply(.SD,myfun) 的语法,但是 .SDcols目前不支持左侧。

做一个功能。 如果你想要一个函数来做到这一点,有
add_myfun <- function(DT,myfun,mycols){
DT[,paste(mycols,myfun,sep="_"):=lapply(.SD,myfun),.SDcols=mycols]
}
add_myfun(x,"median","x2")

可以编写一个可以在 j 中工作的函数吗?的 DT[i,j] ?也许。但我认为这不是一个好主意。
  • 你能确定你的函数对 j 的所有其他用途都是健壮的吗? , 喜欢 by ?
  • 您的函数能否利用 data.table的优化(例如, mean )?
  • 其他人能读懂你的代码吗?
  • 使用 [可能很慢。如果您对许多列执行此操作,则最好初始化新列并使用 set 进行分配。 .
  • 关于r - 使用 `:=` 语法以编程方式生成要分配给 data.table 的列列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30291362/

    25 4 0