首页 > 解决方案 > r 中的内部连接比任何一个数据框都提供更多的行

问题描述

我有两个包含大量数据的数据框,它们都有大约 1000 万行

当我在 r 中使用此查询时:

df<-inner_join(frame1,frame2,by=c("id1"="id2"))

这将返回具有 9000 万行的 df。我不明白这怎么可能,我怎么可能避免这种情况。

标签: rjoindplyr

解决方案


举一个@Wietse de Vries 评论的例子,假设我们将这个表内部连接到自身:

frame1 <- data.frame(id = c(1,2,2,3,3,3), row = 1:6)
inner_join(frame1, frame1, by = c("id1" = "id1"))

#   id1 row.x row.y
#1    1     1     1
#2    2     2     2
#3    2     2     3
#4    2     3     2
#5    2     3     3
#6    3     4     4
#7    3     4     5
#8    3     4     6
#9    3     5     4
#10   3     5     5
#11   3     5     6
#12   3     6     4
#13   3     6     5
#14   3     6     6

输出随着每个键值出现次数的平方而增加——即 id1 为 1 行,id2 为 4 行,id3 为 9 行等。如果之间存在大量相互匹配,则可以达到 9000 万行桌子。

为避免这种情况,请使键列表不同,每个键列表中只有一个:

frame1_distinct <- frame1 %>% distinct(id1, .keep_all = TRUE)
inner_join(frame1_distinct, frame1_distinct, by = c("id1" = "id1"))

  id1 row.x row.y
1   1     1     1
2   2     2     2
3   3     4     4

推荐阅读