R计算两个数据帧之间的重复项

R Count duplicates between two dataframes

我有两个数据帧 df1 和 df2。他们都有一列 'ID'。对于 DF1 中的每一行,我想找出它的 ID 在 df2 中有多少重复项并将计数添加到该行。如果没有重复项,则计数应 return 为 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

使用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

我想你可以用一个简单的 sapply() 和 base r 来完成(没有额外的包)。

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

我们也可以使用outer

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

我们可以使用 semi_joinn() 来计算重复项的数量:

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

输出:

  duplicates_df1_df2
1                  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