R 分组并将函数应用于.SD,但只应用于一个滚动条目

R 分组并将函数应用于.SD,但只应用于一个滚动条目,r,data.table,R,Data.table,我想知道是否有一种优雅的data.table(v1.9.4)方法可以执行以下操作: 用两个变量对DT进行分组,然后在分组表(.SDs)上为.SD中的所有条目计算一些函数,但其中一个应该在.SD中滚动,并将结果放回DT。因此,对于.SDs(以及DT)中的每个条目,结果(可能)是唯一的。您可以将其视为计算DT中某个条目的对等组的某个值,该对等组由两个分组变量(与DT中的条目相同的属性)确定,而不是条目本身 我通过围绕一个简单的:=in data.table的j进行循环来实现这一点,但我想知道是否存在

我想知道是否有一种优雅的data.table(v1.9.4)方法可以执行以下操作: 用两个变量对DT进行分组,然后在分组表(.SDs)上为.SD中的所有条目计算一些函数,但其中一个应该在.SD中滚动,并将结果放回DT。因此,对于.SDs(以及DT)中的每个条目,结果(可能)是唯一的。您可以将其视为计算DT中某个条目的对等组的某个值,该对等组由两个分组变量(与DT中的条目相同的属性)确定,而不是条目本身

我通过围绕一个简单的:=in data.table的j进行循环来实现这一点,但我想知道是否存在纯data.table解决方案。我可以想象像
.SD[I!=id,:=,by=1:nrow(.SD)]
inside
DT[]
这样的东西可以做到这一点,但是:

.SD
j
中使用
:=
保留供将来使用,作为一种(曲折的)灵活方式,按组参考更新
DT

我的解决方案是(计算由
b
c
确定的组的
sum()
,滚动ID除外):


DT罗兰的回答很好!根据我的情况调整它(保留平均值作为函数,添加NA处理):`dt[,c(“temp.mean”,“npeerspus1”):=list(mean(Var1,NA.rm=TRUE),(.N-sum(is.NA(Var1))),by=c(“b”,“c”)]dt[,不包括均值:=(temp.mean*NpeersP1-Var1)/(npeerspus1-1),by=1:nrow(dt)]很好,你找到答案了,然后你可以把它作为一个答案发布出来,以避免问题没有答案。仍然在寻找一个通用的解决方案:我的评论中的方法(即罗兰的解决方案)适用于中间结果(整个组的结果,包括要排除的结果)可以稍后更正以排除条目的函数(此处:平均值,也指总和等)。这似乎并不适用于所有函数,例如,对组中的所有条目使用哈希函数,但滚动函数除外。@Helix123:请发布并接受您自己的答案,这是解决您自己的问题时正确的SO礼仪。这也增加了其他人概括并发布更好答案的机会。注释中的代码是e令人难以置信的不可读。
DT <- data.table(ID = c("a","a","b","b","c","c"),
                 b = c(1, 2, 1, 2, 1, 2),
                 c = c("x", "x", "y", "z", "y", "x"),
                 Var1 = 1:6)

for (id2 in unique(DT$ID)) {
  for (b2 in unique(DT$b)) {
    c2 <- DT[ID==id2 & b==b2, c] 
       DT[ID == id2 & b == b2,
          Var1_sum := sum(DT[ID! = id2 & b == b2 & c == c2, Var1], na.rm=TRUE)]
  }
}

DT
   ID b c Var1 Var1_sum
1:  a 1 x    1        0
2:  a 2 x    2        6
3:  b 1 y    3        5
4:  b 2 z    4        0
5:  c 1 y    5        3
6:  c 2 x    6        2