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

时间:2016-03-12 09:51:25

标签: r merge

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

df1有3903行,df2有351行。

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

我的代码如下:

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

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

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

3 个答案:

答案 0 :(得分:1)

我无法确定您的问题示例,但通常语法是:

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乘3的df,因为每个&#34; a&#34;在df2中已经匹配到每个&#34; a&#34;在df1中,2乘2表示4种排列。

答案 1 :(得分:1)

这可能是因为df2中column1中的值不是1-1映射。意味着column1中的单个值可能与column2中的多个值相关。您可以使用array_diff(MyObject::get()->ByID(1)->toMap(),MyObject::get()->ByID(2)->toMap()); 进行检查。如果您从column1中找到一个带有count&gt;的值1那么这就是原因。

另外我想推荐一个替代方案,如果你对sql更熟悉,有一个非常好的库叫table(df2$column1),允许你在数据帧上使用类似sql的查询!

答案 2 :(得分:0)

要确保第二个数据框在连接列上是唯一的,可以使用我的软件包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" U nique会检查它们在左侧是唯一的,{{1 }}是字母表中的下一个字母。