R:用向量中的项目替换NA

Posted

技术标签:

【中文标题】R:用向量中的项目替换NA【英文标题】:R: replace NA with item from vector 【发布时间】:2011-10-04 19:25:52 【问题描述】:

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

我的数据如下所示:

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

【问题讨论】:

顺便说一句 - 使用 data.frame 作为变量名可能不太好,因为在某些情况下会掩盖 data.frame() 函数。 在什么情况下?这不是一个真正的问题。 正如@hadley 所说,这不是一个真正的问题。我假设 Y 列不包含所有相同的值......就像他说的那样,我们需要上下文。 【参考方案1】:

ifelse 是你的朋友。

使用 Dirk 的数据集

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

【讨论】:

想比较一下您和 Dirk 的回答速度吗? 我没有为这两种方法计时,但它们都立即执行(不像我的原始代码需要几分钟)。我想我更喜欢这种方法只是因为它使用一行代码而不是两行。【参考方案2】:

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

设置数据:

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> 

【讨论】:

which 的目的是什么?数字索引是否比逻辑索引更快/更不容易出错? 我更喜欢数字索引(这里是单个 '3')而不是长度为 N 的布尔值。 @Joshua:我发现数字索引确实比逻辑索引要快得多,如果 TRUE 案例的数量相对于元素总数来说很小。 这里是多余的。我想这一切都取决于你更喜欢布尔代数还是集合论。 越短越好,并且更容易检查中间结果。屏住呼吸等待whch2 ;-)【参考方案3】:

不幸的是,我还不能发表评论,但是在对一些涉及字符串(也称为字符)的代码进行矢量化处理时,上述内容似乎不起作用。 this answer 中解释了原因。如果涉及字符,stringsAsFactors=FALSE 是不够的,因为 R 可能已经从字符中创建了因子。需要确保数据也再次成为字符向量,例如data.frame(X=as.character(c("x", "x", NA, "x")), Y=as.character(rep("y",4)), stringsAsFactors=FALSE)

【讨论】:

以上是关于R:用向量中的项目替换NA的主要内容,如果未能解决你的问题,请参考以下文章

用序列中的缺失值替换 NA (R)

用R中的组中的非NA字符替换一组值的NA [重复]

r 用R中的0替换NA,NAN和Inf

更改条件以替换向量中的元素

将列中的 NA 替换为相邻列中的值

用R中不同数据帧中具有相同ID的行中的值替换列中的NA