R 使用.SD检索lappy中的列名
我想对data.table中的所有列应用一个函数。因此,我将.SD与lapply一起使用。但是,在lappy中,我无法检索表的列 比如说R 使用.SD检索lappy中的列名,r,data.table,R,Data.table,我想对data.table中的所有列应用一个函数。因此,我将.SD与lapply一起使用。但是,在lappy中,我无法检索表的列 比如说 x = data.table(a=1:10, b=10:1, id=1:5) x[,lapply(.SD,function(t){t*id}),.SDcols=c(1,2)] Error in ..FUN(a) : object 'id' not found 我做了以下工作: x[,lapply(.SD,function(t){t*x$id}),.SDcol
x = data.table(a=1:10, b=10:1, id=1:5)
x[,lapply(.SD,function(t){t*id}),.SDcols=c(1,2)]
Error in ..FUN(a) : object 'id' not found
我做了以下工作:
x[,lapply(.SD,function(t){t*x$id}),.SDcols=c(1,2)]
我们能做得更好吗?只要删除
.SDcols=c(1,2)
。删除第三列(id
)
要不具有id
,以下所有操作都将起作用:
x[,lapply(.SD[,list(a,b)], `*`, id)]
x[,lapply(.SD[,-3], `*`, id)]
x[,lapply(.SD, `*`,id)][, list(a,b)]
谢谢有没有办法避免在i列上应用该函数?@Nicolas请检查我的编辑。小提示,如果你介意速度,请尽量给你的函数提供最紧凑的结构(通常这意味着更快的代码)。我喜欢你给出的三种选择中的第一种,尽管使用
.SD
会变得多余。我认为x[,lapply(列表(a,b),
*,id)]
是最好的解决方案,它只需要输入.SDcols
。嗨,我实际上不使用SDcols
。对于这个特定的情况,您是对的(尽管保存的输入时间差异很小,但我需要检查一下)Lappy
+.SD
对于具有许多列的数据表来说是最佳实践(出于明显的原因)。
x[,lapply(.SD[,list(a,b)], `*`, id)]
x[,lapply(.SD[,-3], `*`, id)]
x[,lapply(.SD, `*`,id)][, list(a,b)]