我有以下代码:
options(java.parameters = "-Xmx4000m")
require(xlsx)
library(plyr)
setwd("~/PycharmProjects/CatScrape")
rm(list=ls(all=TRUE))
jgc <- function() .jcall("java/lang/System", method = "gc")
Master <- read.xlsx2("MASTER.xlsx", sheetIndex = 2, startRow = 1, colIndex=4,endRow = 10000, as.data.frame = TRUE, header=TRUE)
Dutch_Stage <- read.xlsx2("languages/Dutch.xlsx", sheetIndex = 1, startRow = 1, colIndex=c(5,8),endRow = 10000, header=TRUE)
Dutch <- unique(Dutch_Stage)
rm(Dutch_Stage)
Dutch <- rename(Dutch, c("Key.s."="Key", "Status"="Dutch"))
jgc()
output <- merge(Master, Dutch, by="Key", all.Master = TRUE)
## OUTPUT RECORD NUMBER MATCHES MASTER
Finnish_Stage <- read.xlsx2("languages/Finnish.xlsx", sheetIndex = 1, startRow = 1, colIndex=c(5,8),endRow = 10000, header=TRUE)
Finnish <- unique(Finnish_Stage)
rm(Finnish_Stage)
Finnish <- rename(Finnish, c("Key.s."="Key", "Status"="Finnish"))
jgc()
output <- merge(output, Finnish, by="Key", all.output = TRUE)
## OUTPUT RECORD NUMBER INCREASES by 6
我还要添加12个文件,当发生这种情况时,我的记录数量最多为25倍。
在这种情况下,all.output = TRUE
设置为所有文件,我的目标是只显示Master中的记录以及与这些记录的关联。我不想要额外的记录。
这让我觉得这不是真正的&#34;左连接&#34;。我如何使它成为一个&#34; LEFT JOIN&#34;?
由于
答案 0 :(得分:2)
评论时间太长,所以我会在答案中给出两分钱:
总的来说,如果没有样本数据,很难直接回答您的问题。但是,通常如果你想要left join
,你应该这样做:
merge(x,y,all.x=T).
上面的代码是说保留x数据集(左数据集)
中的所有观察结果然而,我怀疑这不会解决你的问题,因为你得到的是更多,而不是比预期更少的观察。我认为你的问题很可能是unique(Finnish_Stage)
。使用此唯一语句并不一定意味着您的Key
变量每个值只有1个观察值(如果您将其他变量映射到可能存在问题的相同键值) 。例如,请尝试:unique(data.frame(Key=c(1,1,2),value=c(1,2,3)))
连接(包括左连接)将所有内容合并在一起。也许其他人可以稍微用语言来解释这一点,但我认为一个例子是展示发生情况的最佳方式:
数据:强>
d1 <- data.frame(y1=c(1,2,3),y2=c(4,5,6),y3=c(7,8,9))
d2 <- data.frame(y1=c(1,1,2))
原创加入(内部联接)
merge(d1,d2,all.output=TRUE)
y1 y2 y3
1 1 4 7
2 1 4 7
3 2 5 8
在这里你可以看到我们有一个重复的行。这是因为y1=1
数据集中有两个d2
值,因此连接会将这些值合并两次。
左连接也会发生同样的事情:
左连接
merge(d1,d2,all.x=TRUE)
y1 y2 y3
1 1 4 7
2 1 4 7
3 2 5 8
4 3 6 9
所以可能发生的事情是,您对每个Key
值都有多个观察值,然后导致这些值被多次合并,从而为您提供比预期更多的观察值。
要解决这个问题,我只是确保您只能在要合并的数据集中看到Key
变量的1个值(如果确实如此,请确保仅基于Key的nodupe变量)。如果您希望有超过1 Key
的值,那么合并实际上就是以它应该的方式工作。
tldr:左连接不必返回与原始数据集相同的行数。
答案 1 :(得分:0)
在dplyr中:(确保在plyr后导入[因为许多早期的plyr函数需要弃用])
library(dplyr)
output <-
Master %>%
mutate(Key.s = Key) %>%
left_join(Dutch) %>%
left_join(Finnish) %>%
distinct