根据组值填写NA [重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据组值填写NA [重复]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
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
非常感谢。
答案
假设'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)]
以上是关于根据组值填写NA [重复]的主要内容,如果未能解决你的问题,请参考以下文章