2017-04-04 87 views
0

我有2個數據幀:比較邏輯數據幀和數字數據幀

> df1 
    a b c 
1 1a 11 21 
2 2a 12 22 
3 3b 13 23 
4 4b 14 24 
5 5b 15 25 
> df2 
    a  b  c 
1 1a TRUE TRUE 
2 2a FALSE FALSE 
3 3b TRUE FALSE 
4 4b TRUE TRUE 
5 5b FALSE FALSE 

我只需要保留的df1TRUE值和與NA這樣更換FALSE值:

> df3 
    a  b  c 
1 1a 11 21 
2 2a NA NA 
3 3b 13 NA 
4 4b 14 24 
5 5b NA NA 

我一直在想使用for循環來檢查數據幀的每個位置(只有b和c列),但我不知道是否有一個基本函數或包可以使用。

PS。我需要列a在過程中始終存在,以免丟失。 謝謝大家。

+0

兩個數據集中'a'的所有值是否相同? – MrFlick

+0

是的,df2是應用於df1的運營商的產品。兩個數據幀都具有相同的列值。 – noriega

回答

1

如果你知道,無論data.frames有a以相同的順序相同的值,你可以做

if(all(df1$a==df2$a)) { 
    is.na(df1[,-1]) <-!df2[,-1] 
    # alternatively 
    # df1[,-1][!as.matrix(df2[,-1])] <- NA 
} 

is.na功能允許重新分配,並把NA值的地方,右手邊是TRUE

+0

它工作。由於'a'列對於兩個數據幀都是相同的,所以省略了'if'子句,並且只使用了'is.na(df1 [, - 1])< - !df2 [, - 1]'。謝謝。 – noriega