合并(连接)数据框 - 结果中的行太多
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"
是下一个字母在字母表中)。
【讨论】:
以上是关于合并(连接)数据框 - 结果中的行太多的主要内容,如果未能解决你的问题,请参考以下文章