【问题标题】:Comparing two dataframe in r比较r中的两个数据框
【发布时间】:2017-05-02 11:47:53
【问题描述】:

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

所以我需要获取一个 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 具有 NA(R 给我 TRUE),则在我的 df 中不起作用。

另外,我认为如果我在mapply() 中更改df 的顺序,我将获得相同的结果,但在我的情况下并非如此。数据帧也有不同的级别,所以df1==df2 不起作用。

我还会问你如何计算结果中的 FALSE。有is.na()之类的吗?

谢谢大家

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我们可以只使用== 得到一个逻辑矩阵

    (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
    

    【讨论】:

    • 我遇到了这个错误:Error in Ops.factor(left, right) : level sets of factors are different
    • @mppd 比较好character类列,i.e. df1[]
    • 我已经看到,如果在其中一个 df 我有 NA,最后我有 NA,但如果这是一个错误的陈述。例如,如果 df1 中为 NA 而 df2 中不是(反之亦然),我如何维持 NA,并且如果 df 1 中的 AT 与 df2 中的 AA 不同,我如何获得 FALSE 语句?
    • @mppd 在这种情况下,您只需删除is.na 之一,即(df1 == df2) &amp; !is.na(df2)
    • 非常非常非常有帮助!你成就了我的一天(和我的工作)。谢谢!
    【解决方案2】:

    另一种可能的选择,

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

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

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

    【讨论】:

    • 它不起作用。它用 na 纠正错误,但如果不是,则给出 TRUE 值。
    • 我不明白。所以如果你有两个值'NA'和'NA',你想让它显示FALSE?
    • 不,如果在 df1 中有 AG 而在 df2 中有 NA,我会看到 FALSE,这很好,但是使用您的代码,如果我在 df1 AG 和 df2 TT 中有,我会看到 TRUE,它是不是我需要的。我希望现在可以更好地解释
    • @mppd 我得到了 FALSE。我得到了和你一样的结果
    • 我在df1[] &lt;-lapply(df1, as.character); df2[] &lt;- lapply(df2, as.character) 之前设置,因为级别不同。但最后我得到了一个全是 FALSE 的表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多