gre*_*ane 8 replace r missing-data imputation
我试图用我的数据中的一些缺失值替换来自类似组的平均值.
我的数据如下:
X Y
1 x y
2 x y
3 NA y
4 x y
Run Code Online (Sandbox Code Playgroud)
我希望它看起来像这样:
X Y
1 x y
2 x y
3 y y
4 x y
Run Code Online (Sandbox Code Playgroud)
我写了这个,它有效
for(i in 1:nrow(data.frame){
if( is.na(data.frame$X[i]) == TRUE){
data.frame$X[i] <- data.frame$Y[i]
}
}
Run Code Online (Sandbox Code Playgroud)
但是我的data.frame几乎有五十万行,而for/if语句非常慢.我想要的是类似的东西
is.na(data.frame$X) <- data.frame$Y
Run Code Online (Sandbox Code Playgroud)
但这会导致不匹配的大小错误.似乎应该有一个命令来执行此操作,但我无法在SO或R帮助列表中找到它.有任何想法吗?
Ric*_*ton 10
ifelse 是你的朋友.
使用Dirk的数据集
df <- within(df, X <- ifelse(is.na(X), Y, X))
Run Code Online (Sandbox Code Playgroud)
只是向量化它 - 布尔索引测试是一个表达式,你也可以在赋值中使用它.
设置数据:
R> df <- data.frame(X=c("x", "x", NA, "x"), Y=rep("y",4), stringsAsFactors=FALSE)
R> df
X Y
1 x y
2 x y
3 <NA> y
4 x y
Run Code Online (Sandbox Code Playgroud)
然后继续计算替换位置的索引,并替换:
R> ind <- which( is.na( df$X ) )
R> df[ind, "X"] <- df[ind, "Y"]
Run Code Online (Sandbox Code Playgroud)
产生了预期的结果:
R> df
X Y
1 x y
2 x y
3 y y
4 x y
R>
Run Code Online (Sandbox Code Playgroud)