如果目标是n / a,则将源复制到目标

时间:2016-03-26 01:13:50

标签: r dataframe

我有这个简单的数据框:

> 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,但前提是bNA。所以我的最终数据应该是:

> 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

2 个答案:

答案 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))