如何在R

时间:2016-10-07 17:48:45

标签: r

我有以下代码:

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;?

由于

2 个答案:

答案 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