如何使用分组通过函数调用为数据表的列赋值

时间:2014-09-08 22:59:51

标签: r data.table

我需要通过处理传递给函数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?

1 个答案:

答案 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]