【问题标题】:how compare 2 datafram and choose some rows of one of them which has same value in some of columns of another df如何比较 2 个数据框并选择其中一个数据框的某些行,这些行在另一个 df 的某些列中具有相同的值
【发布时间】:2019-09-20 06:32:15
【问题描述】:

我有 2 个数据框 df1 和 df2,我想检查 df2 中是否有任何行的值与 df1 中的 4 列具有相同的值?

               df1 

                    a1    a2.    a3     a4
                    1      2      3     4
                    1      2      3     5
                    1      6      3     3
                    1      2      8     4


               df2 

                    a1    a2.    a3     a4
                    1      2      3     9
                    4      2      8     5
                    1      6      3     7
                    5      2      8     2

假设我想在 df2 中选择在 a1 、 a2 和 a3 中的 df1 中具有相同值的行:

输出

                    a1    a2.    a3     a4
                    1      2      3     9
                    1      6      3     7

【问题讨论】:

  • 为什么只选择df1的第一行?第二行具有相同的三个条目:a1a2a3
  • 我编辑了输出

标签: r dataframe


【解决方案1】:

使用dplyr,我们可以从df1中取消选择列a4,执行inner_join,然后使用distinct_all()删除重复行。

library(dplyr)


df2 %>% 
  inner_join(select(df1, -a4)) %>% 
  distinct_all()

  a1 a2. a3 a4
1  1   2  3  9
2  1   6  3  7

或者base R

unique(merge(df1[,-4], df2))

或者:

unique(merge(subset(df1, select = -a4), df2))

【讨论】:

  • 问题是你使用 -a4 并且我的列太多,但需要检查 3 列是否相等
  • 然后试试unique(merge(subset(df1, select = c(a1, a2, a3), df2))?
  • df2 %>% inner_join(select(df1, a1, a2, a3)) %>% distinct_all()
  • 如果我在两个数据集中都有相同的组,我可以在每个组中都这样做吗?
  • 也给了我错误:subset.data.frame 中的错误(NonJointTrip, select = c("ARR_HR", "ARR_MIN", : 'subset' must be logical
【解决方案2】:

使用基本 R,我们可以 paste 对数据框逐行感兴趣的列,并选择 df2 中匹配的行。

cols <- paste0("a", 1:3)

df2[do.call(paste, c(df2[cols], sep = "-")) %in% 
       do.call(paste, c(df1[cols], sep = "-")), ]

#  a1 a2 a3 a4
#1  1  2  3  9
#3  1  6  3  7

【讨论】:

  • 如果两者都有一个组,我想在每个组中都这样做?
  • 我也收到此错误:错误:当 i 是 data.table(或字符向量)时,必须使用 'on=' 参数指定要连接的列(请参阅 ?data.table ) 或通过键入 x(即已排序,并且,标记为已排序,请参阅 ?setkey)。由于 x 在 RAM 中排序,键控连接可能对非常大的数据有进一步的速度优势。
  • @hghg 你似乎得到了data.table。在应用上述代码之前,您可能需要先将其转换为 data.frame。
  • 使用您的代码时出现错误。你能处理我现在上传的数据吗?
  • @hghg 添加! 签名df2[!do.call(paste, c(df2[cols], sep = "-")) %in% do.call(paste, c(df1[cols], sep = "-")), ]
猜你喜欢
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 2022-07-13
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
  • 2020-07-04
  • 2019-12-17
相关资源
最近更新 更多