R:为什么在合并数据时 - 获得的结果大于两个数据

时间:2016-08-30 02:17:17

标签: r merge

我有两个数据集,如下所示:

数据A:

newPCODE1   INT
 T306     986566   
 U078     94333    
 T324     97170   
 R354     97489   
 T538     987411    
 R141     94334
 ...

数据B:

 newPCODE1 PRICE
 A001  2535
 A002  1200
 A003  1560
 A004  2575
 A005  5575
 A006  1140
 ....

dataA有大约400,000行,dataB有大约40,000行,但是当我使用以下函数进行合并时,我得到的数据大约是500,000。我想知道为什么会发生这种情况,并且这两个数据只有一列共享名称 - newPCODE1。我试图谷歌,但没有找到太多信息。非常感谢任何见解!

combo_new = merge(dataA,dataB, by = "newPCODE1")

2 个答案:

答案 0 :(得分:2)

每个newPCODE1匹配都会在合并的数据框中添加一行,包括重复代码。例如,如果T306dataA中出现两次,在dataB中出现三次,那么您的合并数据框中将从newPCODE1的值中获得六行(因为T306中的第一个dataAdataB中的三行匹配,而T306中的第二个dataAdataB中的相同三行匹配。

计算合并数据框中的行数:

首先,只会从newPCODE1(以您的问题中使用的格式)返回两个数据框中的merge个值。换句话说,我们需要来自两个数据框的newPCODE1的交集:

common.codes = intersect(dataA$newPCODE1,dataB$newPCODE1)

每个newPCODE1值返回的行数将是两个数据帧中每个值newPCODE1的行数的乘积。合并数据框中的总行数是这些乘积的总和:

sum(table(dataA$newPCODE1[dataA$newPCODE1 %in% common.codes]) * 
      table(dataB$newPCODE1[dataB$newPCODE1 %in% common.codes]))

在下面的示例中,请注意合并的数据框有25行,即使原始的两个数据帧只有20行。如果所有10行在两个数据帧中都具有相同的newPCODE1值,合并的数据框将有100行。 (例如,T306出现在dataA的所有400,000行和dataB的所有40,000行中,您的合并数据框将有400,000 * 40,000 = 160亿行!)

dataA = data.frame(newPCODE1=c(1,3,4,4,5,5,6,6,6,6), value1=letters[1:10])
dataB = data.frame(newPCODE1=c(3,4,5,5,5,6,6,6,6,10), value2=LETTERS[1:10])
merge(dataA,dataB, by="newPCODE1")
   newPCODE1 value1 value2
1          3      b      A
2          4      c      B
3          4      d      B
4          5      e      C
5          5      e      D
6          5      e      E
7          5      f      C
8          5      f      D
9          5      f      E
10         6      g      G
11         6      g      H
12         6      g      I
13         6      g      F
14         6      h      G
15         6      h      H
16         6      h      I
17         6      h      F
18         6      i      G
19         6      i      H
20         6      i      I
21         6      i      F
22         6      j      G
23         6      j      H
24         6      j      I
25         6      j      F
common.codes = intersect(dataA$newPCODE1,dataB$newPCODE1)

sum(table(dataA$newPCODE1[dataA$newPCODE1 %in% common.codes]) * 
      table(dataB$newPCODE1[dataB$newPCODE1 %in% common.codes]))
[1] 25

如果要保留一个或两个数据帧中的行,即使其他数据框中没有匹配的行,也可以这样做:

merge(dataA,dataB, by="newPCODE1", all.x=TRUE)   # Keep all rows from first data frame
merge(dataA,dataB, by="newPCODE1", all.y=TRUE)   # Keep all rows from second data frame
merge(dataA,dataB, by="newPCODE1", all=TRUE)     # Keep all rows from both data frames

答案 1 :(得分:2)

你应该按如下方式进行合并。

combo_new <- merge(dataA, dataB, by.x="newPCODE1", by.y="newPCODE1")

但我认为你的主要问题是唯一性,是否存在newPCODE1的精确1-1映射?如果有多个,可能会尝试匹配所有比赛。例如,除了B1 B1和C1 C1之外,(A,A,B,C)x(A,B,C)将具有A1至A1和A1至A2。因此额外的匹配。