我有这个简单的数据框:
> dframe = data.frame(a=c(1,2,NA), b=c(11,NA,33))
> dframe
a b
1 1 11
2 2 NA
3 NA 33
我的目标是将每行a
复制到b
,但前提是b
为NA
。所以我的最终数据应该是:
> dframe
a b
1 1 11
2 2 2
3 NA 33
我试过了,但它给了我一个错误:
> dframe[is.na(dframe$b), "b"] <- dframe[!is.na(dframe$a), "a"]
Error in `[<-.data.frame`(`*tmp*`, is.na(dframe$b), "b", value = c(1, :
replacement has 2 rows, data has 1
答案 0 :(得分:3)
我们根据&#39; b&#39;中的NA值创建逻辑索引。 (&#39; I1&#39)。然后在&#39; a&#39;中分配值。到&#39;&#39;对应于&#39; i1&#39;。
i1 <- is.na(dframe$b)
dframe$b[i1] <- dframe$a[i1]
dframe
# a b
#1 1 11
#2 2 2
#3 NA 33
在OP的代码中,<-
的lhs和rhs的索引是不同的,因为它正在替换&#39; a&#39;中的非NA元素。对于&#39; b&#39;的NA元素。问题在于错误中提到的元素数量,即使基于索引的NA和非NA元素的数量相同,它也不会替换相应的元素。
sum(is.na(dframe$b))
#[1] 1
sum(!is.na(dframe$a))
#[1] 2
答案 1 :(得分:1)
dframe$b=ifelse(is.na(dframe$b),dframe$a,dframe$b))