我有一个data.table格式的数据集dt
,看起来像
type id val
1 m 1 5
2 m 1 3
3 m 1 NA
3 e 2 7
4 e 3 7
5 m 4 4
6 m 4 2
7 m 4 NA
我想用类型val
的{{1}}用{{1}的总和来替换每个组的最后一个条目(在我的示例中是NA
)的id
}组中其他条目。也就是说,我想得到一个像这样的数据集:
m
目前,我正在尝试围绕data.table函数,尤其是.SD进行研究,并希望使用这些工具解决问题。
到目前为止,我已经发现val
使我可以访问相关元素,而 type id val
1 m 1 5
2 m 1 3
3 m 1 8
3 e 2 7
4 e 3 7
5 m 4 4
6 m 4 2
7 m 4 6
为我提供了正确的总和。但是,我无法将两者放在一起。
感谢您的帮助。
答案 0 :(得分:1)
我们可以使用na.aggregate
library(zoo)
library(data.table)
setDT(dt)[type == 'm', val := na.aggregate(val, FUN = sum), id]
dt
# type id val
#1: m 1 5
#2: m 1 3
#3: m 1 8
#4: e 2 7
#5: e 3 7
#6: m 4 4
#7: m 4 2
#8: m 4 6
答案 1 :(得分:0)
我们可以使用replace
:
library(data.table)
dt[type == "m", val := replace(val, .N, sum(val, na.rm = TRUE)), id]
dt
# type id val
#1: m 1 5
#2: m 1 3
#3: m 1 8
#4: e 2 7
#5: e 3 7
#6: m 4 4
#7: m 4 2
#8: m 4 6
答案 2 :(得分:0)
另一个选择:
library(data.table)
setDT(dt)[type == 'm', val := c(val[-.N], sum(val, na.rm = TRUE)), by = id]
输出:
type id val
1: m 1 5
2: m 1 3
3: m 1 8
4: e 2 7
5: e 3 7
6: m 4 4
7: m 4 2
8: m 4 6