2017-06-13 55 views
0

我有兩個數據幀。數據幀的值替換 - R

一:

>df1   a  b  c  d 
    W_1  NA NA NA NA 
    W_2  2  2  2  4 
    W_3  4  2  2  4 
    W_4  NA NA NA NA 

二:

>df2  a  b  c  d 
    W_1 TRUE FALSE FALSE FALSE 
    W_2 FALSE TRUE FALSE TRUE 
    W_3 TRUE FALSE FALSE TRUE 
    W_4 FALSE TRUE FALSE TRUE 

我要替換第一數據幀與NA,其中在第二個數據幀值FALSE地方。

輸出應該是:

  a  b  c  d 
W_1  NA NA NA NA 
W_2  NA  2 NA  4 
W_3  4 NA NA  4 
W_4  NA NA NA NA 

這是我的代碼:

for (i in nrow(df2)) { 
    for (j in 1:ncol(df2)) { 
    a = df2[i,j] 
    if (a == FALSE) { 
     df1[i,j] = NA 
    } 
    } 
} 

雖然我沒有得到任何錯誤返回,代碼也不起作用。第一個數據幀保持不變。任何建議可能是錯誤的?

感謝您的幫助。

+2

'DF1 [!DF2] < - NA'應該這樣做 – Cath

+3

或者像'is.na(df1)< - !df2' – Frank

+1

@quant比較'FALSE ==「FALSE」'和'「FALSE」==「FALSE''。強制節省時間。 – Frank

回答

6

如果行/的df2比賽的cols準確的df1的那些,你可以只使用在df2邏輯值替換要在df1什麼:

df1[!df2] <- NA 

@Frank的工作方式同樣:

is.na(df1) <- !df2 

實施例:

df1 <- data.frame(matrix(1:16, ncol=4)) 
set.seed(123) 
df2 <- data.frame(matrix(sample(c(TRUE, FALSE), 16, replace=TRUE), ncol=4)) 
df1[!df2] <- NA # or is.na(df1) <- !df2 
df1 
# X1 X2 X3 X4 
#1 1 NA NA NA 
#2 NA 6 10 NA 
#3 3 NA NA 15 
#4 NA NA 12 NA 
+0

它給了我一個錯誤'錯誤在樂趣(左):無效參數類型',它是什麼意思? –

+0

@ bass.bz你可以使用'dput'來給我們的數據結構,否則很難說出發生了什麼 – Cath

2

我們可以高效setdata.table

library(data.table) 
setDT(df1) 
for(j in seq_along(df1)){ 
set(df1, i = which(!df2[[j]]), j=j, value = NA) 
} 

df1 
# a b c d 
#1: NA NA NA NA 
#2: NA 2 NA 4 
#3: 4 NA NA 4 
#4: NA NA NA NA 

做到這一點作爲@Frank在評論中提到的,它也將工作,無須轉換爲data.table

for(j in seq_along(df1)){ 
    set(df1, i = which(!df2[[j]]), j=j, value = NA) 
    } 
df1 
#  a b c d 
#W_1 NA NA NA NA 
#W_2 NA 2 NA 4 
#W_3 4 NA NA 4 
#W_4 NA NA NA NA 
+0

只有當兩個數據幀中的行數相同時,它纔有效? –

+0

@ bass.bz是的,它基於你的例子。如果不一樣,不確定你想要替換值的邏輯 – akrun