2016-09-09 56 views
3

假設我有兩個數據幀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 

而且還假設,

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數據框架使得:

  • 如果在中的條目等於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

謝謝!

+2

做難道你的意思是'資源< - A; res [] < - as.matrix(A)[as.logical(NA ^!B_mask)]' – akrun

+1

@akrun是的!請把它作爲答案,我會接受它:) – user32416

回答

6

我們創建數據集('res')的副本,在'B_mask'中將'FALSE'轉換爲NA,並使用邏輯索引將'A'的相應值進行子集分配並將輸出分配回' RES'配合結構完好([]

res <- A 
res[] <- as.matrix(A)[as.logical(NA^!B_mask)] 

或者作爲@alexis_laz提到這也可以

is.na(res) <- !as.matrix(B_mask) 
+1

同上@StevenBeaupré說。 +1 –

+2

爲了避免一些算術和強制,替代似乎是'res = A; is.na(res)=!as.matrix(B_mask)' –