【问题标题】:R Count duplicates between two dataframesR计数两个数据帧之间的重复项
【发布时间】:2021-07-20 13:59:52
【问题描述】:

我有两个数据框 df1 和 df2。他们都有一个“ID”列。对于 DF1 中的每一行,我想找出其 ID 在 df2 中有多少个重复项,并将计数添加到该行。如果没有重复,则计数应返回为 0。

# # A tibble: 4 x 3
#      ID     a     b
#   <dbl> <dbl> <dbl>
# 1     1_234     1     1
# 2     1_235     1     2
# 3     2_222     1     1
# 4     2_654     1     2




# # A tibble: 4 x 3
#      ID     a     b
#   <dbl> <dbl> <dbl>
# 1     1_234     1     1
# 2     1_235     1     2
# 3     1_234     1     1
# 4     3_234     1     2

【问题讨论】:

  • 请使用dput提供数据样本。

标签: r duplicates


【解决方案1】:

使用dplyr:

您的数据:

df1 <- data.frame(ID = c("1_234","1_235","2_222","2_654"),
                  a = c(1,1,1,1),
                  b = c(1,2,1,2))

df2 <- data.frame(ID = c("1_234","1_235","1_234","3_235"),
                  a = c(1,1,1,1),
                  b = c(1,2,1,2))

编辑:只考虑IDs:

output <- left_join(df1,
          as.data.frame(table(df2$ID)),
          by = c("ID" = "Var1")) %>% 
  mutate(Freq = ifelse(is.na(Freq), 0, Freq))

输出:

     ID a b Freq
1 1_234 1 1    2
2 1_235 1 2    1
3 2_222 1 1    0
4 2_654 1 2    0

【讨论】:

  • 我怎样才能修改这个只看ID?我对其他变量是否相同不感兴趣,只是 ID。
【解决方案2】:

使用subset + aggregate 的基本 R 选项

subset(
    aggregate(
        n ~ .,
        rbind(
            cbind(df1, n = 1),
            cbind(df2, n = 1)
        ), function(x) length(x) - 1
    ), ID %in% df1$ID
)

给予

     ID a b n
1 1_234 1 1 2
2 2_222 1 1 0
3 1_235 1 2 1
4 2_654 1 2 0

【讨论】:

    【解决方案3】:

    我认为您可以使用简单的 sapply() 和 base r(无需额外的包)来完成。

    df1$count <- sapply(df1$ID, function(x) sum(df2$ID == x))
    

    【讨论】:

    • 我实际上只对 ID 感兴趣 - 而不是其他值。抱歉没有指定。但是,这需要很长时间,有没有另一种有效的方法?
    【解决方案4】:

    我们也可以使用outer

    df1$count <- rowSums(outer(df1$ID, df2$ID, FUN = `==`))
    df1$count
    [1] 2 1 0 0
    

    【讨论】:

      【解决方案5】:

      我们可以使用semi_joinn() 来获取重复次数:

      library(dplyr)
      df1 %>% 
        semi_join(df2, by="ID") %>% 
        summarise(duplicates_df1_df2 = n())
      

      输出:

        duplicates_df1_df2
      1                  2
      

      【讨论】:

        猜你喜欢
        • 2016-08-11
        • 1970-01-01
        • 2013-06-20
        • 1970-01-01
        • 1970-01-01
        • 2023-02-02
        • 2012-08-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多