如何在下标作业中忽略NA

时间:2015-07-29 13:02:45

标签: arrays r

给定两个(命名)数组x和y,其中所有dimnames(y)都存在于x中。

如何使用y中的值填充(更新)x,但忽略y中的NA?

我到目前为止:

x<-array(1:15,dim=c(5,3),dimnames=list(1:5,1:3))
y<-(NA^!diag(1:3))*diag(1:3)
dimnames(y)<-list(1:3,1:3)
x[match(names(y[,1]),names(x[,1])),match(names(y[1,]),names(x[1,]))]<-y

但是这也会用&#34; NA&#34; s覆盖x。

   1  2  3
1  1 NA NA
2 NA  2 NA
3 NA NA  3
4  4  9 14
5  5 10 15

我想这是一个涉及过滤器的东西!is.na(y)但是我还没有找到合适的位置吗?

感谢任何提示

3 个答案:

答案 0 :(得分:2)

我们match'y'的rownames,其名称为'x',用于创建行索引('rn'),类似地通过match获取相应的列索引('cn') 。获取'y'中非NAs('indx')的值索引。使用'indx'将行索引,列索引和resubset设置为'x',并将这些值替换为y(y[indx])中的非NA值。

 rn <- match(rownames(y), rownames(x))
 cn <- match(colnames(y), colnames(x))
 indx <- which(!is.na(y), arr.ind=TRUE)
 x[rn,cn][indx] <- y[indx]

或者代替match,我们可以使用rownames(y)colnames(y)对'x'进行子集化,并像以前一样替换它。

 x[rownames(y), colnames(y)][indx] <- y[indx]

答案 1 :(得分:2)

您可以直接使用rownamescolnames索引,以获取y覆盖的x的相关部分,并使用ifelse有条件地替换:

x[rownames(y),colnames(y)] <- ifelse(is.na(y),x[rownames(y),colnames(y)],y)
x
  1  2  3
1 1  6 11
2 2  2 12
3 3  8  3
4 4  9 14
5 5 10 15

答案 2 :(得分:1)

仅为完整性: 接受的答案是在假设我们有一个二维数组(行/同名)的情况下工作的。

但是真正的问题在于更高维度的空间(这可能适用于后来的读者)我在这里展示了解决方案如何也可以应用于最初的维度独立方法:

indx <- !is.na(y)
x[match(names(y[,1]),names(x[,1])),match(names(y[1,]),names(x[1,]))][indx] <- y[indx]

谢谢!