2016-12-02 113 views
0

我想结合使用j的.SD lapply的结果与j.的其他输出列我怎样才能在同一个数据表中做到这一点? 到目前为止,我创建两个数据表(example_summary1, example_summary2)并合并他们,但应该有更好的方法? 也许我不完全理解的.SD/.SDcols.R数据表将lapply与其他j参数结合起来

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 
+0

你有多少列? – Sotos

+0

在我的真实数据中,我有大约42列,我想用'.SDcols'和一些其他列来处理我想包含到j输出列表中的列。 – Cracker

+0

这些列会干扰'SDcols'之外的其他列。我不确定这是可能的,还是我只能使用'SDcols'? – Cracker

回答

2

这是最好的,你可以做的概念,如果你正在使用.SDcols

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

如果你不.SDcols包括numbers它不是在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连接速度非常快,以至于我会使用您的方法。

+0

感谢您的快速回答。我不想手动编写所有SDcols,所以后面的那个不是一个选项。但第一个看起来很有希望。 我一直认为'.SDcols'只会干扰'.SD'。这个限制有点不直观。 – Cracker

+0

'.SD'是j中所有可用列的data.table。 – Roland

+0

如果您有一个列名称向量,请参阅我的编辑选项。 – Roland

相关问题