dplyr包的内部_连接输出不正确

dplyr包的内部_连接输出不正确,r,dplyr,R,Dplyr,我有两个数据集,名为results和support2 我想用唯一的通用列名SNP合并这两个数据集。代码如下: > library(dplyr) > results <- read_delim("<path>\\results", delim = "\t", col_name = T) > support2 <- read_delim("<path>\\support2", delim = "\t", col_name = T) > h

我有两个数据集,名为results和support2

我想用唯一的通用列名SNP合并这两个数据集。代码如下:

> library(dplyr)
> results <- read_delim("<path>\\results", delim = "\t", col_name = T)
> support2 <- read_delim("<path>\\support2", delim = "\t", col_name = T)

> head(results)
# A tibble: 6 x 2
  SNP        p.value
  <chr>        <dbl>
1 rs28436661   0.334
2 rs9922067    0.322
3 rs2562132    0.848
4 rs3930588    0.332
5 rs2562137    0.323
6 rs3848343    0.363

 > head(support2)
# A tibble: 6 x 2
  SNP         position
  <chr>          <dbl>
1 rs62028702     60054
2 rs190434815    60085
3 rs62028703     60087
4 rs62028704     60095
5 rs181534180    60164
6 rs186233776    60177

> dim(results)
[1] 188242      2
> dim(support2)
[1] 1210619       2

# determine the number of common SNPs
length(Reduce(intersect, list(results$SNP, support2$SNP)))
[1] 187613

I would expect that after inner_join, the new data would have 187613 rows.

> newdata <- inner_join(results, support2)
Joining, by = "SNP"
> dim(newdata)
[1] 1409812       3
奇怪的是,新数据没有187613行,而是1409812行,这甚至比两个数据帧的行数总和还要大

我切换到合并功能,如下所示:

> newdata2 <- merge(results, support2)
> dim(newdata2)
[1] 1409812       3
第二个新数据帧也有同样的问题。不知道为什么


我想知道如何获得一个新的数据帧,该数据帧的行表示两个数据帧的公共行,应该有187613行,列包含两个数据帧的列。

正如@akrun已经指出的,数据可能有重复项,这可能是对该行为的唯一解释

从intersect的文档中,它总是返回一个唯一的值,但是如果by值具有重复项,则内部联接可能具有重复项,因此计数不匹配

如果您真的想看到它的右边,请在您的情况下查看by variable unique key的唯一计数,它应该与您的intersect结果相匹配。但这并不意味着您的联接/合并是正确的,理想情况下,任何在表A和表B中都有重复项的联接都不推荐,除非您有业务/其他理由。因此,请检查两个表中是否都存在重复项,或者仅其中一个表中存在重复项。如果它只在其中一个表中找到,那么您的合并/连接可能就可以了。我希望我能够解释这种情况

请让我知道,如果它不能回答你的问题,我将删除它

从文件中:

相交:

union、intersect、setdiff和setequal中的每一个都将丢弃任何 参数中存在重复的值,并将其作为.vector应用于参数 论据

内螺纹联接:

返回x中y中有匹配值的所有行,以及 从x和y开始的列。如果x和y之间存在多个匹配项, 将返回所有匹配项的组合


正如@akrun已经指出的,数据可能有重复项,这可能是对这种行为的唯一解释

从intersect的文档中,它总是返回一个唯一的值,但是如果by值具有重复项,则内部联接可能具有重复项,因此计数不匹配

如果您真的想看到它的右边,请在您的情况下查看by variable unique key的唯一计数,它应该与您的intersect结果相匹配。但这并不意味着您的联接/合并是正确的,理想情况下,任何在表A和表B中都有重复项的联接都不推荐,除非您有业务/其他理由。因此,请检查两个表中是否都存在重复项,或者仅其中一个表中存在重复项。如果它只在其中一个表中找到,那么您的合并/连接可能就可以了。我希望我能够解释这种情况

请让我知道,如果它不能回答你的问题,我将删除它

从文件中:

相交:

union、intersect、setdiff和setequal中的每一个都将丢弃任何 参数中存在重复的值,并将其作为.vector应用于参数 论据

内螺纹联接:

返回x中y中有匹配值的所有行,以及 从x和y开始的列。如果x和y之间存在多个匹配项, 将返回所有匹配项的组合


这可能是重复元素的结果

results <- data.frame(col1 = rep(letters[1:3], each = 3), col2 = rnorm(9))
support2 <- data.frame(col1 = rep(letters[1:5],each = 2), newcol = runif(10))

library(dplyr)
out <- inner_join(results, support2)
nrow(out)
#[1] 18

在这里,公共列“col1”中的初始数据集是重复的,这会混淆join语句应该将哪一行作为匹配行,从而导致类似于交叉联接的情况,但不完全是重复元素的结果

results <- data.frame(col1 = rep(letters[1:3], each = 3), col2 = rnorm(9))
support2 <- data.frame(col1 = rep(letters[1:5],each = 2), newcol = runif(10))

library(dplyr)
out <- inner_join(results, support2)
nrow(out)
#[1] 18

这里,,公共列“col1”中的初始数据集是重复的,这会混淆join语句应将哪一行作为匹配行,从而导致类似于交叉连接的情况,但不完全是每个数据集中的by列都可能有重复的数据集。您可能有重复的SNP值,即,如果有一个数据帧有一次snp1,另一次有3次,你会得到3行这个值。但是,您所包含的数据片段不包含任何重叠的SNP值,您最好举一个可以在文章中复制该问题的示例,因此,人们不需要从其他地方下载数据,因此文章不依赖可能发生变化的第三方。每个数据集中的by列可能存在重复项。您可能有重复的SNP值——即,如果一个数据帧有一次SNP 1,另一个有三次,您将得到三行该值。然而,您所包含的数据片段不包含任何重叠的SNP值,而且您最好在文章中举一个可以复制该问题的例子,这样人们就不需要从其他地方下载数据,因此文章不依赖可能发生变化的第三方