使用另一个掩码数据帧揭示一个数据帧的值

use*_*416 3 r dataframe

假设我有两个数据帧AB_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
Run Code Online (Sandbox Code Playgroud)

并且假设,

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
Run Code Online (Sandbox Code Playgroud)

如何获得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.

谢谢!

akr*_*run 6

我们创建数据集的副本('res'),将'FALSE'转换为'B_mask'中的NA,并使用逻辑索引对'A'的相应值进行子集化,并将输出分配回'res'与'结构完整([])

res <- A
res[] <- as.matrix(A)[as.logical(NA^!B_mask)]
Run Code Online (Sandbox Code Playgroud)

或者@alexis_laz提到这也可以用

is.na(res) <- !as.matrix(B_mask)
Run Code Online (Sandbox Code Playgroud)

  • 为了避免一些算术和强制,一个替代似乎是`res = A; is.na(res)=!as.matrix(B_mask)` (2认同)