我需要通过处理传递给函数calcVal的组来在数据表dt中创建一个名为val的列
calcVal<-function(x) {
# return a column of values by processing all the columns of the data table corresponding to that group
}
dt[,val:=calcVal,by=group_id]
如何将该组传递给函数calcVal?
答案 0 :(得分:0)
正如@David指出的那样,如果您阅读?data.table
,则在data.table中执行by=
操作时可以使用特殊变量。例如,
library(data.table)
calcVal<-function(SD, BY) {
paste(BY,SD$x-1, round(SD$y*5,3), sep="_")
}
dt<-data.table(x=1:10, y=runif(10), group_id=rep(letters[1:2], each=5))
dt[,val:=calcVal(.SD, .BY),by=group_id]
# x y group_id val
# 1: 1 0.81431099 a a_0_4.072
# 2: 2 0.81022670 a a_1_4.051
# 3: 3 0.79922535 a a_2_3.996
# 4: 4 0.62207166 a a_3_3.11
# 5: 5 0.46298899 a a_4_2.315
# 6: 6 0.65807961 b b_5_3.29
# 7: 7 0.06256007 b b_6_0.313
# 8: 8 0.30950615 b b_7_1.548
# 9: 9 0.94511284 b b_8_4.726
# 10: 10 0.70209066 b b_9_3.51
当然这是一个愚蠢的例子。如果你提供了自己的示例数据并且明确了你在helper函数中想要完成的内容,那将会有所帮助。如果你不想传递所有变量,你可以只指定你想要的那些。
calcVal<-function(x, g) {
paste(g,x, sep="_")
}
dt<-data.table(x=1:10, y=runif(10), group_id=rep(letters[1:2], each=5))
dt[,val:=calcVal(x, group_id),by=group_id]