给定两个(命名)数组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)但是我还没有找到合适的位置吗?
感谢任何提示
答案 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)
您可以直接使用rownames
和colnames
索引,以获取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]
谢谢!