我有两个数据集,如下所示:
数据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")
答案 0 :(得分:2)
每个newPCODE1
匹配都会在合并的数据框中添加一行,包括重复代码。例如,如果T306
在dataA
中出现两次,在dataB
中出现三次,那么您的合并数据框中将从newPCODE1
的值中获得六行(因为T306
中的第一个dataA
与dataB
中的三行匹配,而T306
中的第二个dataA
与dataB
中的相同三行匹配。
计算合并数据框中的行数:
首先,只会从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。因此额外的匹配。