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的主要内容,如果未能解决你的问题,请参考以下文章