合并(连接)数据框 - 结果中的行太多

Posted

技术标签:

【中文标题】合并(连接)数据框 - 结果中的行太多【英文标题】:Merge (join) data frames - too many rows in result 【发布时间】:2016-06-27 15:15:59 【问题描述】:

我有两个数据框(df1 和 df2)。我想使用合并功能加入他们。

df1 有 3903 行,df2 有 351 行。

我想通过一个公共列(column1)将 df2 左连接到 df1。我正在使用合并功能。

我的代码如下:

dfjoin<-merge(df1,df2, by="column1",all.x=TRUE)

所以我希望 dfjoin 有 3903 行等于 df1 的行。但是它返回 4010 行。

为什么它返回的行数比预期的多。我会很高兴得到任何帮助。非常感谢。

【问题讨论】:

这可能是因为 df2 的 column1 中的值不是 1-1 映射。这意味着 column1 中的单个值可能与 column2 中的多个值相关。您可以使用table(df2$column1) 进行检查。如果您从 column1 中找到一个计数 > 1 的值,那么这就是原因。 另外,如果您对 sql 更满意,我想推荐一个替代方案,有一个非常好的库,名为 sqldf,它允许您在数据帧上使用类似 sql 的查询! 【参考方案1】:

这可能是因为 df2 的 column1 中的值不是 1-1 映射。这意味着 column1 中的单个值可能与 column2 中的多个值相关。您可以使用table(df2$column1) 进行检查。如果您从 column1 中找到一个计数 > 1 的值,那么这就是原因。

此外,如果您对 sql 更熟悉,我想推荐一个替代方法,有一个非常好的库,名为 sqldf,它允许您在数据帧上使用类似 sql 的查询!

【讨论】:

感谢 LT RDizzl3。正如你所说,这些表不是一对一的映射。【参考方案2】:

如果没有看到您的问题示例,我无法确定,但通常语法是:

df <- merge(df1, df2, by.all="name_of_column_in_common", all.x=T)

但是,如果您要匹配的列具有重复值,则 r 将匹配所有可能的组合。所以,

df1 <- data.frame(id=c("a","a","b","c"), x1=rnorm(4))
df2 <- data.frame(id=c("a","a","b"), x2=rnorm(3))
df <- merge(df1, df2, by.all="id", all.x=T)

将为您提供一个尺寸为 6 x 3 的 df,因为 df2 中的每个“a”已与 df1 中的每个“a”相匹配,4 个排列的 2 x 2。

【讨论】:

【参考方案3】:

为了确保您的第二个数据框在连接列上是唯一的,您可以使用我的包safejoin(一个包装dplyr的连接函数),它将如果不是这样,给你一个明确的错误。

目前情况:

df1 <- data.frame(column1 = c("a","b","b"), X = 1:3)
df2 <- data.frame(column1 = c("a","b"), Y = 4:5)
df3 <- data.frame(column1 = c("a","a","b"), Y = 4:6)

merge(df1,df2, by="column1",all.x=TRUE)
#   column1 X Y
# 1       a 1 4
# 2       b 2 5
# 3       b 3 5

merge(df1,df3, by="column1",all.x=TRUE)
#   column1 X Y
# 1       a 1 4
# 2       a 1 5
# 3       b 2 6
# 4       b 3 6

一些值被错误地重复了。

使用safejoin

# devtools::install_github("moodymudskipper/safejoin")
library(safejoin)
safe_left_join(df1, df2, check= "V")
#   column1 X Y
# 1       a 1 4
# 2       b 2 5
# 3       b 3 5

safe_left_join(df1, df3, check= "V")
# Error: y is not unique on column1
# Call `rlang::last_error()` to see a backtrace

check = "V" 控制连接列在右侧是唯一的(check = "U" like Unique 检查它们在左侧是唯一的,"V" 是下一个字母在字母表中)。

【讨论】:

以上是关于合并(连接)数据框 - 结果中的行太多的主要内容,如果未能解决你的问题,请参考以下文章

pandas:合并(内连接)数据框的行数比原始行数多

在 Python 中合并数据框时出现重复的行

R:合并同一数据表中的行,连接某些列

sql 用union合并合并查询结果

如何合并/连接两个不同长度的熊猫数据框?

如何使用 groupby 和聚合将 pyspark 数据框中的行与多列连接起来