根据组值填写NA

时间:2017-03-22 09:36:23

标签: r data.table

replace NA value with the group value不是特定于data.table的,虽然答案类似,但下面(我的问题)的答案使用data.table更优雅。我如何获得重复的标签?谢谢你

这绝对不是Replacing NAs with latest non-NA value

的重复

我有一个data.table,如

library(data.table)
test <- data.table(id=c(1,1,1,2,2,2,3,3,3), A=c("Val1","Val1", NA, "Val2", NA, NA, NA, NA, "Val3"), B=c(1,NA,NA, 2,2,NA,NA,NA,3))
test   
    id    A  B
1:  1 Val1  1
2:  1 Val1 NA
3:  1   NA NA
4:  2 Val2  2
5:  2   NA  2
6:  2   NA NA
7:  3   NA NA
8:  3   NA NA
9:  3 Val3  3

由“id”定义的组。

我想用其组中的值填充NA值。你看到了解决方案吗?

结果应如下所示(关于字符和数字特征):

   id    A B
1:  1 Val1 1
2:  1 Val1 1
3:  1 Val1 1
4:  2 Val2 2
5:  2 Val2 2
6:  2 Val2 2
7:  3 Val3 3
8:  3 Val3 3
9:  3 Val3 3

非常感谢你。

1 个答案:

答案 0 :(得分:2)

假设'A'和'B'列的每个'id'只有唯一的元素,在按'id'分组后,循环遍历Data.table的子集(.SD)并得到第一个非NA元素并将其分配(:=)到列

test[, (2:3) := lapply(.SD, function(x) x[!is.na(x)][1]) , id]

或者在删除NA行后对数据集进行连接

test[na.omit(test), names(test)[-1] :=  mget(paste0("i.", names(test)[-1])) , on = .(id)]