R数据表将lapply与其他j参数组合在一起

时间:2016-12-02 10:54:55

标签: r data.table

我想将j中使用.SD的lapply结果与j.中的其他输出列结合使用?如何在同一数据表中执行此操作? 到目前为止,我创建了两个数据表(example_summary1, example_summary2)并合并它们但应该有更好的方法吗? 也许我不完全理解.SD/.SDcols.

的概念
 example <-data.table(id=rep(1:5,3),numbers=rep(1:5,3),sample1=sample(20,15,repla    ce=TRUE),sample2=sample(20,15,replace=100))

     id numbers sample1 sample2
 1:  1       1      17      18
 2:  2       2       8       1
 3:  3       3      17      12
 4:  4       4      15       2
 5:  5       5      14      18
 6:  1       1      11      14
 7:  2       2      12      12
 8:  3       3      11       7
 9:  4       4      16      13
10:  5       5      17       1
11:  1       1      10       3
12:  2       2      14      15
13:  3       3      13       3
14:  4       4      17       6
15:  5       5       1       5


example_summary1<-example[,lapply(.SD,mean),by=id,.SDcols=c("sample1","sample2")]

      > example_summary1
   id  sample1   sample2
1:  1 12.66667 11.666667
2:  2 11.33333  9.333333
3:  3 13.66667  7.333333
4:  4 16.00000  7.000000
5:  5 10.66667  8.000000


example_summary2<-example[,.(example.sum=sum(numbers)),id]

> example_summary2
   id example.sum
1:  1           3
2:  2           6
3:  3           9
4:  4          12
5:  5          15

1 个答案:

答案 0 :(得分:2)

如果您使用.SDcols

,这是您可以做的最好的事情
example_summary1 <- example[, c(lapply(.SD, mean), .(example.sum = sum(numbers))),
                          by = id, .SDcols = c("sample1", "sample2", "numbers")][, numbers := NULL][]

如果您未在numbers中添加.SDcols,则j中不提供该内容。

如果没有.SDcols,您可以这样做:

example_summary1 <- example[, c(lapply(.(sample1 = sample1, sample2 = sample2), mean), 
                               .(example.sum = sum(numbers))),
                            by=id]

或者如果你有一个列名矢量:

cols <- c("sample1","sample2")
example_summary1 <- example[, c(lapply(mget(cols), mean), 
                               .(example.sum = sum(numbers))),
                            by=id]

但我怀疑你没有得到相同的data.table优化。

最后,data.table连接速度非常快,我会使用你的方法。