比较r中的两个数据帧

时间:2017-05-02 11:47:54

标签: r dataframe

我需要比较两个解释相同内容的数据帧,但它们来自不同的方式来获取它们。

所以我需要获得一个df,其中每个单独的值与另一个df上的相应值进行比较,如果值相同则给我TRUE,如果它们不是,则为FALSE。

我写一个例子只是为了更好地解释:

DF1

>    1  2  3  
> 1 AT GC CC 
> 2 AG GC CT 
> 3 GG TT <NA>

DF2

>    1  2   3  
> 1 AT <NA> GG 
> 2 AG  GC  CG 
> 3 GG  TT  AA

结果

>      1     2     3  
> 1 TRUE <NA>  FALSE 
> 2 TRUE TRUE  FALSE 
> 3 TRUE TRUE  <NA>

我在这里看到了一个结果

Comparing two similar dataframes and finding different values between them

但在我的df中,如果其中一个df有NA(R给我TRUE),则不起作用。

另外,我认为如果我在mapply()中更改df的顺序,我将获得相同的结果,但在我的情况下它不正确。数据框也有不同的级别,因此df1==df2无效。

我也会问你如何计算结果中的FALSE。是否有类似is.na()的内容?

谢谢大家

2 个答案:

答案 0 :(得分:2)

我们可以使用==来获取逻辑矩阵

(df1 == df2) & !is.na(df1) & !is.na(df2)
#    1     2     3
#1 TRUE FALSE FALSE
#2 TRUE  TRUE FALSE
#3 TRUE  TRUE FALSE

如果列是factor类,那么我们可以将colwise与mapply/Map进行比较

mapply(function(x, y) {i1 <- as.character(x)==as.character(y)
         replace(i1, is.na(i1), FALSE)}, df1, df2)

或者比较为matrix,然后将NA转换为FALSE

m1 <- as.matrix(df1) == as.matrix(df2)
m1[is.na(m1)] <- FALSE

答案 1 :(得分:1)

另一种可能的选择,

df1 == replace(df2, is.na(df2), 'NA')

或如果两个数据帧都包含NA,

replace(df1, is.na(df1), 'NA') == replace(df2, is.na(df2), 'NA')