R merge()R合并而不是合并

R merge()R合并而不是合并,r,dataframe,merge,rbind,R,Dataframe,Merge,Rbind,我在R中遇到了一个我无法理解的merge()行为。看起来它要么合并数据帧,要么rbinds数据帧,这取决于列中是否有一个或多个唯一值 a1 <- data.frame (A = c (1, 1)) a2 <- data.frame (A = c (1, 2)) # > merge (a1, a1) # A # 1 1 # 2 1 # 3 1 # 4 1 # > merge (a2, a2) # A # 1 1 # 2 2 a1合并(a2,a2) #A # 1

我在R中遇到了一个我无法理解的
merge()
行为。看起来它要么合并数据帧,要么rbinds数据帧,这取决于列中是否有一个或多个唯一值

a1 <- data.frame (A = c (1, 1))
a2 <- data.frame (A = c (1, 2))

# > merge (a1, a1)
#   A
# 1 1
# 2 1
# 3 1
# 4 1

# > merge (a2, a2)
#   A
# 1 1
# 2 2
a1合并(a2,a2)
#A
# 1 1
# 2 2

后者是我在这两种情况下所期望和想要的结果。我还尝试了使用多个列,以及字符而不是数字,结果是一样的:多个值导致合并,一个唯一的值会导致rbinding。

在第一种情况下,每行匹配两行,因此输出中有2x2=4行;在第二种情况下,每行匹配一行,因此输出中有2行

要匹配行号,请使用以下命令:

merge(a1, a1, by = 0)
##   Row.names A.x A.y
## 1         1   1   1
## 2         2   1   1
或匹配行号,只返回左边的实例:

library(sqldf)

sqldf("select x.* from a1 x left join a1 y on x.rowid = y.rowid")
##   A
## 1 1
## 2 1
或匹配行号并返回两个实例:

sqldf("select x.A A1, y.A A2 from a1 x left join a1 y on x.rowid = y.rowid")
##   A1 A2
## 1  1  1
## 2  1  1

该行为在文档中有详细说明,但基本上,
merge()
默认情况下会给您一个
data.frame
,其中的列取自两个原始dfs。它将通过所有公共列的唯一值合并两行

df1 <- data.frame(a = 1:3, b = letters[1:3])
df2 <- data.frame(a = 1:5, c = LETTERS[1:5])
df1
  a b
1 1 a
2 2 b
3 3 c
df2
  a c
1 1 A
2 2 B
3 3 C
4 4 D
5 5 E
merge(df1, df2)
  a b c
1 1 a A
2 2 b B
3 3 c C
案例2:

> df1 <- data.frame(a = c(1, 2), b = letters[1:2])
> df2 <- data.frame(a = c(1, 2), c = LETTERS[1:2])
> df1
  a b
1 1 a
2 2 b
> df2
  a c
1 1 A
2 2 B
> merge(df1, df2)
  a b c
1 1 a A
2 2 b B
>df1 df2 df1
a b
11A
2 b
>df2
a c
11A
2 B
>合并(df1,df2)
a、b、c
1 a
2乙

谢谢。你知道我是否可以在不借助任何外部软件包的情况下实现同样的结果吗?这就是第一个示例所显示的。如果您只需要列的子集,那么可以在合并后对它们进行子集设置。我正在考虑一个更清晰的结果,比如使用
sqldf
,但不使用它。您需要在合并后进行修复。谢谢。我阅读了文档,但没有从那里理解它;我想我现在明白了。你知道有什么办法吗?类似于merge
by=“row.names()”
,但结果中没有
row.names
列,并且
A
列没有加倍?@KamilS。文件第2段最后一句:“如果有多个匹配项,则所有可能的匹配项都会贡献一行。有关“匹配”的确切含义,请参见匹配。。因此,在问题的示例中,
a1
中的第一个1与
a1
中的两个1匹配,第二个1与两个1匹配。@KamilS我不太确定我是否理解您想要的结果。如果您想要与第一个答案中的代码(G.Grothendieck)生成的输出相同的输出,只需输出行名,您只需执行
merge(df1,df2,by=0)[,-1]
。然而,这将复制公共列。@MilanValášek我想在G.Grothendieck的回答中得到第二个结果,基本上我想
merge(a1,a1)
a1
相同。只有我想在不使用任何外部包的情况下获得它。那么对于潜在的附加列会发生什么呢?比如说,您有两个数据帧,就像我的“案例1”中的数据帧一样。他们应该如何治疗?
> df1 <- data.frame(a = c(1, 2), b = letters[1:2])
> df2 <- data.frame(a = c(1, 2), c = LETTERS[1:2])
> df1
  a b
1 1 a
2 2 b
> df2
  a c
1 1 A
2 2 B
> merge(df1, df2)
  a b c
1 1 a A
2 2 b B