繁体   English   中英

将 NA 替换为 R 中某些列的先前值

[英]Replace NA with previous value for certain column in R

我想根据该特定 ID 的给定变量值将NA转换为某个值。 示例查询:df1 ---> df2

df1 = data.frame(ID=c(1,1, 1, 1, 2,2,2,2,3,3,3,3),WHR=c(0.8,NA, NA, NA,1.0, NA, NA,NA,1.1, NA, NA, NA))

df2=data.frame(ID=c(1,1, 1, 1, 2,2,2,2,3,3,3,3),WHR=c(0.8,0.8, 0.8, 0.8,1.0, 1.0,1.0,1.0, 1.1, 1.1,1.1,1.1))`

我试过的

R 用条件填写 NA 前一行值

library(xts)
df1[,WHR:=na.locf("WHR", fromlast=TRUE, by = ID)` 

有错误:

could not find function ":="; 

我使用此代码是因为我有数百个 ID 值,并且我想要一个自动代码,可以根据 ID 更改特定列中的NA

如何将df1转换为df2 (也请解释您的代码,因此它可以帮助其他初学者用户)。 谢谢!

使用基数 R,您可以使用它们的位置和ave函数的 cumsum 广播第一个非 NA:

df2$WHR.Comp = ave(df1$WHR, cumsum(!is.na(df1$WHR)), FUN=function(x) x[1])

> df2
   ID WHR WHR.Comp
1   1 0.8      0.8
2   1 0.8      0.8
3   1 0.8      0.8
4   1 0.8      0.8
5   2 1.0      1.0
6   2 1.0      1.0
7   2 1.0      1.0
8   2 1.0      1.0
9   3 1.1      1.1
10  3 1.1      1.1
11  3 1.1      1.1
12  3 1.1      1.1

您可以为缺失值构建映射:

idx <- !is.na(df1[,"WHR"])
map <- setNames(df1[idx,"WHR"], df1[idx,"ID"])

然后将此映射应用于NA

df2[!idx, "WHR2"] <- map[df2[!idx, "ID"]]

身份证的意思:

for (i in unique(df1$ID)) df1[df1$ID==i & is.na(df1[,'WHR']),'WHR'] <- mean(df2[df2$ID==i,'WHR'])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM