R:将NA替换为向量中的项



我试图用类似组的平均值替换数据中的一些缺失值。

我的数据是这样的:

   X   Y
1  x   y
2  x   y
3  NA  y
4  x   y

我想让它看起来像这样:

  X   Y
1  x   y
2  x   y
3  y   y
4  x   y

我写了这个,它工作了

for(i in 1:nrow(data.frame){
   if( is.na(data.frame$X[i]) == TRUE){
       data.frame$X[i] <- data.frame$Y[i]
   }
  }

但是我的data.frame几乎有50万行长,而且for/if语句相当慢。我想要的是像

这样的东西
is.na(data.frame$X) <- data.frame$Y

但是这会得到一个大小不匹配的错误。似乎应该有一个这样做的命令,但我在SO或R帮助列表中找不到它。什么好主意吗?

ifelse是你的朋友。

使用Dirk的数据集

df <- within(df, X <- ifelse(is.na(X), Y, X))

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

设置数据:

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

然后计算替换位置的索引,并替换:

R> ind <- which( is.na( df$X ) )
R> df[ind, "X"] <- df[ind, "Y"]

产生期望的结果:

R> df
  X Y
1 x y
2 x y
3 y y
4 x y
R> 

如果您已经在使用dplyr或tidyverse,则可以使用合并函数来完成此操作。

> df <- data.frame(X=c("x", "x", NA, "x"), Y=rep("y",4), stringsAsFactors=FALSE)
> df %>% mutate(X = coalesce(X, Y))
  X Y
1 x y
2 x y
3 y y
4 x y```

不幸的是我不能评论,但是,当向量化一些代码时,其中涉及字符串或字符,上述似乎不起作用。这个答案解释了原因。如果涉及字符,则stringsAsFactors=FALSE是不够的,因为R可能已经从字符中创建了因子。需要确保数据也再次成为字符向量,例如,data.frame(X=as.character(c("x", "x", NA, "x")), Y=as.character(rep("y",4)), stringsAsFactors=FALSE)

相关内容

  • 没有找到相关文章

最新更新