我有两个数据帧(df1和df2)。我想使用合并功能加入他们。
df1有3903行,df2有351行。
我想通过公共列(column1)将df2连接到df1。我正在使用合并功能。
我的代码如下:
dfjoin<-merge(df1,df2, by="column1",all.x=TRUE)
所以我希望dfjoin有3903行等于df1的行。但是它返回4010行。
为什么它会返回比预期更多的行。我会很高兴得到任何帮助。非常感谢。
答案 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 }}是字母表中的下一个字母。