0

我有一些关于data.table的问题/建议。


R)  X = data.table(x=c("q","q","q","w","w","e"),y=1:6,z=10:15)
R) X[,list(sum(y)),by=list(x)]
   x V1
1: q  6
2: w  9
3: e  6

我觉得不得不写太糟糕了

R) X[,list(y=sum(y)),by=list(x)]
   x y
1: q 6
2: w 9
3: e 6

它应该默认保持相同的列名(即:y),其中函数只调用一列,这在大多数情况下将是一个巨大的收益,通常在金融中,因为我们通常将其视为加权和或上次或.. . => 有没有我可以设置为默认此行为的变量?


在进行选择时,我可能想对几列进行微积分,并对所有其他列应用另一个操作。我的意思是太糟糕了,当我想要这个时:

R)  X = data.table(x=c("q","q","q","w","w","e"),y=1:6,z=10:15,t=20:25,u=30:35)
R) X
   x y  z  t  u
1: q 1 10 20 30
2: q 2 11 21 31
3: q 3 12 22 32
4: w 4 13 23 33
5: w 5 14 24 34
6: e 6 15 25 35
R) X[,list(y=sum(y),z=last(z),t=last(t),u=last(u)),by=list(x)] #LOOOOOOOOOOONGGGG 
#EXPR
   x y  z  t  u
1: q 6 12 22 32
2: w 9 14 24 34
3: e 6 15 25 35

我不能像这样写...

R) X[,list(sum(y)),by=list(x),defaultFn=last] #defaultFn would be 
applied to all remaniing columns

=> 我能以某种方式做到这一点(可能正在设置一个选项)吗?


谢谢

4

1 回答 1

3

在第 1 部分,这不是一个坏主意。我们已经对 中的表达式这样做了by,并且已经在列表中列出了一些接近的内容j

FR#2286 推断的命名可能适用于 j=colname[...]
查找每个组的最大值并返回另一列

但如果我们这样做了,它可能需要通过一个选项打开,以保持向后兼容性。我在那个 FR 中添加了一个链接,返回到这个问题。


在第二部分怎么样:

X[,c(y=sum(y),lapply(.SD,last)[-1]),by=x]
   x y  z  t  u
1: q 6 12 22 32
2: w 9 14 24 34
3: e 6 15 25 35

不过,请分别提出多个问题。SO上的每个问题都应该是一个问题。

于 2012-12-05T21:06:02.633 回答