根据其他元素更新.SD组中的最后一个元素

时间:2020-03-22 12:35:46

标签: r data.table data-cleaning

我有一个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 为我提供了正确的总和。但是,我无法将两者放在一起。

感谢您的帮助。

3 个答案:

答案 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