9

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

我的数据如下所示:

   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 帮助列表中找不到它。有任何想法吗?

4

3 回答 3

11

ifelse是你的朋友。

使用 Dirk 的数据集

df <- within(df, X <- ifelse(is.na(X), Y, X))
于 2011-07-13T21:26:31.523 回答
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

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

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> 
于 2011-07-13T19:49:55.343 回答
0

Unfortunately I cannot comment, yet, but while vectorizing some code where strings aka characters were involved the above seemd to not work. The reason being explained in this answer. If characters are involved stringsAsFactors=FALSE is not enough because R might already have created factors out of characters. One needs to ensure that the data also becomes a character vector again, e.g., data.frame(X=as.character(c("x", "x", NA, "x")), Y=as.character(rep("y",4)), stringsAsFactors=FALSE)

于 2014-11-03T11:36:38.103 回答