R 分组并将函数应用于.SD,但只应用于一个滚动条目
我想知道是否有一种优雅的data.table(v1.9.4)方法可以执行以下操作: 用两个变量对DT进行分组,然后在分组表(.SDs)上为.SD中的所有条目计算一些函数,但其中一个应该在.SD中滚动,并将结果放回DT。因此,对于.SDs(以及DT)中的每个条目,结果(可能)是唯一的。您可以将其视为计算DT中某个条目的对等组的某个值,该对等组由两个分组变量(与DT中的条目相同的属性)确定,而不是条目本身 我通过围绕一个简单的:=in data.table的j进行循环来实现这一点,但我想知道是否存在纯data.table解决方案。我可以想象像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进行循环来实现这一点,但我想知道是否存在
.SD[I!=id,:=,by=1:nrow(.SD)]
insideDT[]
这样的东西可以做到这一点,但是:
在.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