R:用向量中的项替换NA

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)


Dir*_*tel 8

只是向量化它 - 布尔索引测试是一个表达式,你也可以在赋值中使用它.

设置数据:

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)

  • @Joshua:我发现,如果TRUE例的数量相对于元素总数较小,则数字索引的确比逻辑索引快得多。 (2认同)