假设我有两个数据框A
和B_mask
,其中
A <- as.data.frame( matrix(1:20,nrow=4) )
V1 V2 V3 V4 V5
1 1 5 9 13 17
2 2 6 10 14 18
3 3 7 11 15 19
4 4 8 12 16 20
并且假设,
B_mask <- matrix(FALSE, nrow=4, ncol=5)
B_mask[2:3, 1:3] <- TRUE
B_mask <- as.data.frame(B_mask)
V1 V2 V3 V4 V5
1 FALSE FALSE FALSE FALSE FALSE
2 TRUE TRUE TRUE FALSE FALSE
3 TRUE TRUE TRUE FALSE FALSE
4 FALSE FALSE FALSE FALSE FALSE
如何获得result
数据框,以便:
如果B_mask
中的条目等于TRUE
,请在A
中显示相应的值?例如,因为B_mask[2,1] = TRUE
,我希望result[2,1] = A[2,1] = 2
。
如果B_mask
中的条目等于FALSE
,请将A
中的相应值覆盖为NA
?例如,因为B_mask[3,4] = FALSE
,我希望result[3,4] = NA
。
谢谢!
答案 0 :(得分:6)
我们创建数据集的副本('res'),将'FALSE'转换为'B_mask'中的NA,并使用逻辑索引对'A'的相应值进行子集化,并将输出分配回'res '结构完整([]
)
res <- A
res[] <- as.matrix(A)[as.logical(NA^!B_mask)]
或者@alexis_laz提到这也可以用
完成is.na(res) <- !as.matrix(B_mask)