2017-04-04 50 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