Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在R中执行左连接合并_R - Fatal编程技术网

如何在R中执行左连接合并

如何在R中执行左连接合并,r,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 =

我有以下代码:

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
选项(java.parameters=“-Xmx4000m”)
需要(xlsx)
图书馆(plyr)
setwd(“~/PycharmProjects/CatScrape”)
rm(列表=ls(全部=TRUE))

jgc评论有点太长了,所以我会在回答中给出我的两分钱:

总的来说,如果没有样本数据,很难直接回答您的问题。但是,如果您想要
左连接
,通常应执行以下操作:

merge(x,y,all.x=T). 
上面的代码是说保留x数据集(左侧数据集)中的所有观察值

然而,我怀疑这不会解决你的问题,因为你得到的观察结果比预期的多,而不是少。我认为您的问题可能与
unique(Finnish_Stage)
有关。使用此唯一语句并不一定意味着您的
变量对每个值只有一个观察值
(如果您有其他变量映射到同一键值,则可能会出现问题)。例如,试试这个:
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))
在这里,您可以看到我们有一个重复的行。这是因为在
d2
数据集中有两个
y1=1
值,因此联接将两次合并这些值

左连接也会发生同样的情况:

左连接

merge(d1,d2,all.output=TRUE)

  y1 y2 y3
1  1  4  7
2  1  4  7
3  2  5  8
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
变量的1个值(如果确实需要,请确保仅基于Key变量进行nodupe)。如果您希望有超过1个
值,那么合并实际上是按照它应该的方式工作的


tldr:左连接不必返回与原始数据集相同的行数。

对于注释来说有点太长,因此我将在回答中给出我的两分钱:

总的来说,如果没有样本数据,很难直接回答您的问题。但是,如果您想要
左连接
,通常应执行以下操作:

merge(x,y,all.x=T). 
上面的代码是说保留x数据集(左侧数据集)中的所有观察值

然而,我怀疑这不会解决你的问题,因为你得到的观察结果比预期的多,而不是少。我认为您的问题可能与
unique(Finnish_Stage)
有关。使用此唯一语句并不一定意味着您的
变量对每个值只有一个观察值
(如果您有其他变量映射到同一键值,则可能会出现问题)。例如,试试这个:
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))
在这里,您可以看到我们有一个重复的行。这是因为在
d2
数据集中有两个
y1=1
值,因此联接将两次合并这些值

左连接也会发生同样的情况:

左连接

merge(d1,d2,all.output=TRUE)

  y1 y2 y3
1  1  4  7
2  1  4  7
3  2  5  8
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
变量的1个值(如果确实需要,请确保仅基于Key变量进行nodupe)。如果您希望有超过1个
值,那么合并实际上是按照它应该的方式工作的

tldr:左连接不必返回与原始数据集相同的行数。

在dplyr中:(确保在plyr之后导入[因为许多早期plyr函数需要弃用])

库(dplyr)
产量%
变异(Key.s=Key)%>%
左联合(荷兰语)%>%
左联合(芬兰语)%>%
不同的
在dplyr中:(确保在plyr之后导入[因为许多早期的plyr函数需要弃用])

库(dplyr)
产量%
变异(Key.s=Key)%>%
左联合(荷兰语)%>%
左联合(芬兰语)%>%
不同的

请参阅。我相信您想要
merge(…,all.x=TRUE)
我想您可能是严重误读了
merge
的文档。当文档说明一个参数被称为
all.x
时,这意味着该参数实际上是
all.x
,而不是
all.
。确定。试过了。同样的结果。您还得到了什么?如果“右侧”数据框具有重复的键值,它将复制“左侧”数据框中的行。左联接就是这样工作的。返回更多行并不表示“这不是真正的“左联接”。“如果有多个匹配项,即使是内部联接也会返回更多行。请参阅。我相信您想要
merge(…,all.x=TRUE)
我想您可能是严重误读了
merge
的文档。当文档说明一个参数被称为
all.x
时,这意味着该参数实际上是
all.x
,而不是
all.
。确定。试过了。同样的结果。您还得到了什么?如果“右侧”数据框具有重复的键值,它将复制“左侧”数据框中的行。左连接就是这样工作的。返回更多行并不表示“这不是真正的“左连接”。“如果有多个匹配项,即使是内部连接也会返回更多行。对不起,我的朋友。”。虽然这可能是一个很好的解决方案,但是