【问题标题】:Comparing two data frames and filter the values based on their values in r比较两个数据帧并根据它们在 r 中的值过滤值
【发布时间】:2017-01-26 08:55:57
【问题描述】:

我想比较 R 中具有相同列名(df1 和 df2)的两个数据框。根据其中一列(df2)中每一列的值,我想过滤另一列(df1)。对于每个列名,我需要消除 df1 中大于或等于 df2 中的值的行。也就是说,需要在下面产生res1:

df1 <- data.frame( v1 = c(1,2,3,4), v2 = c(2, 10, 5, 11), v3=c(20, 25, 23, 2), v4=c(1,2,1,3) )  

> df1
  v1 v2 v3 v4
1  1  2 20  1
2  2 10 25  2
3  3  5 23  1
4  4 11  2  3

df2 <- data.frame(v1 = 4, v2 = 10, v3 =30, v4 = 3)

> df2
  v1 v2 v3 v4
1  4 10 30 3

因此,通过根据列名将 df1 中的每一行与 df2 进行比较,并消除 df1 中大于或等于 df2 中定义的特定列阈值的行,从而生成所需的输出 res1:

> res1
  v1 v2 v3 v4
1  1  2 20  1
2  3  5 23  1 

【问题讨论】:

  • df2 永远是一行数据框?如果它有多行怎么办?我们应该将它与每一行进行比较吗?
  • @RonakShah 它始终是一行数据帧。在 df2 中,我为删除 df1 中的行定义了阈值。

标签: r dataframe filter compare


【解决方案1】:

我们可以使用mapply&lt;符号来比较两个数据帧,并使用rowSums来索引子集,即

df1[rowSums(mapply(`<`, df1, df2)) == ncol(df1),]
#  v1 v2 v3 v4
#1  1  2 20  1
#3  3  5 23  1

此外,以上内容的完全矢量化翻译可以是(@RonakShah 的赞美),

df1[rowSums(df1 < df2[rep(1, nrow(df1)), ]) == ncol(df1), ]

【讨论】:

    【解决方案2】:

    我们可以使用apply row-wise 并检查该行中的所有元素是否小于其他数据框中的元素

    df1[t(apply(df1, 1, function(x) all(x < df2[1, ]))), ]
    
    #  v1 v2 v3 v4
    #1  1  2 20  1
    #3  3  5 23  1
    

    【讨论】:

      【解决方案3】:

      这是另一个使用 ReduceMap 的选项

      df1[Reduce(`&`, Map(`<`, df1, df2)),]
      #   v1 v2 v3 v4
      #1  1  2 20  1
      #3  3  5 23  1
      

      或者使用tidyverse

      library(dplyr)
      library(purrr)
      map2(df1, df2, `<`) %>% 
             reduce(`&`) %>% 
             df1[.,]
      #   v1 v2 v3 v4
      #1  1  2 20  1
      #3  3  5 23  1
      

      【讨论】:

        猜你喜欢
        • 2017-06-21
        • 2014-11-18
        • 1970-01-01
        • 2012-10-15
        • 1970-01-01
        • 2020-07-03
        • 2017-06-03
        • 2017-04-26
        相关资源
        最近更新 更多