有没有办法在J中“自动命名”表达式

时间:2012-12-05 18:22:45

标签: r data.table

关于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),其中函数只调用一列,这在大多数情况下会大幅增加,通常在财务中,因为我们通常看起来是加权总和或上次要么... =>是否有任何变量可以设置为默认此行为?


执行selectI时,可能希望在少数列上执行微积分,并对所有其他列应用另一个操作。 当我想要这个时,我的意思是太糟糕了:

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

=>我可以以某种方式这样做(可能是设置选项)吗?


谢谢

1 个答案:

答案 0 :(得分:3)

在第1部分,这不是一个坏主意。我们已经为by中的表达式执行了此操作,并且j的列表中已有一些已关闭的内容:

FR#2286 Inferred naming could apply to j=colname[...]
Find max per group and return another column

但如果我们这样做,可能需要通过一个选项打开,以保持向后兼容性。我在该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

但请分别提出多个问题。关于S.O.的每个问题应该只是一个问题。