我正在尝试使用类似组中的平均值替换数据中的某些缺失值。
我的数据如下:
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几乎有五十万行,而for / if语句非常慢。我想要的是像
is.na(data.frame$X) <- data.frame$Y
但是这会出现不匹配的大小错误。似乎应该有一个命令来执行此操作,但我无法在SO或R帮助列表中找到它。有什么想法吗?
答案 0 :(得分:10)
ifelse
是你的朋友。
使用Dirk的数据集
df <- within(df, X <- ifelse(is.na(X), Y, X))
答案 1 :(得分: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>
答案 2 :(得分:0)
不幸的是,我无法发表评论,但是在对某些代码进行矢量化时,字符串也就是字符所涉及的内容似乎无效。原因在this answer中解释。如果涉及字符stringsAsFactors=FALSE
是不够的,因为R可能已经创建了字符外的因子。需要确保数据也再次成为字符向量,例如data.frame(X=as.character(c("x", "x", NA, "x")), Y=as.character(rep("y",4)), stringsAsFactors=FALSE)