为什么使用这两个数据帧的 dplyr left_join() 和 right_join() 的结果不同

Why do results differ for dplyr left_join() and right_join() using these two dataframes

我正在通过本课程中的练习学习如何使用 R dplyr 'join' 函数:https://github.com/uclouvain-cbio/WSBIM1207 并且遇到了下面描述的问题。

首先,下载用于此问题的示例数据框:

BiocManager::install("UCLouvain-CBIO/rWSBIM1207")

加载包:

library(rWSBIM1207)

然后在 R/RStudio 中加载数据帧文件,'clinical2' 和 'expression' 通过键入:

data(clinical2)
data(expression)

首先,任务是: '使用 left_join 和 right_join 函数,根据患者参考加入表达式和 clinical2 表。' 我是这样做的:

left_join(expression, clinical2, 
          by = c("patient" = "patientID"))
right_join(expression, clinical2,
                     by = c("patient" = "patientID"))

第二个任务是解释为什么结果不同。我发现 right_join 输出与 left_join 输出相比多了 3 行。这对我来说似乎很奇怪,因为 'clinical2' 有 516 行,而 'expression' 有 570 行。 r_join 输出中出现的 3 个额外行的共同点是它们包含多个 NA 值,这可能代表在 'clinical2' 而不是 'expression' 中发现的患者。我真的不明白这里发生了什么,如果有任何帮助,我将不胜感激。

更新 可能没有解释清楚。这里用原始数据做一个解释:

创建左连接

left <- left_join(expression, clinical2, by = c("patient" = "patientID"))

dim(expression)
[1] 570   8
dim(left)
[1] 570  10

创建正确的连接

right <- right_join(expression, clinical2,
           by = c("patient" = "patientID"))

dim(expression)
[1] 570   8
dim(right)
[1] 573  10

你想知道dim(right)为什么是573!

分步说明:

  1. right_join()的定义:包括y中的所有行(y在这里clinical2)。
  2. 这样做:clinical2 (y) 中有 3 行不在 expression (x)

看这里: 哪个患者出现在 clinical2 但不出现在 expression

anti_join(clinical2, expression, by=c("patientID"="patient"))

patientID    gender years_at_diagnosis
<chr>        <chr>               <dbl>
1 TCGA-55-7284 male                 74.2
2 TCGA-55-7913 female               61.2
3 TCGA-67-4679 male                 69.0

再次:

right_join(expression, clinical2, by = c("patient" = "patientID"))

我们从 expression(x) (dim = 570 8) 开始并加入 clinical2 (y) (dim = 516 3)

那么现在会发生什么:

  • 来自 expression (x) 的所有 570 与 clinial2 (y) 中的所有匹配 (dim = 516 3) EXCEPT 这 3 个 patientID 在 clinical2 TCGA-55-7284, TCGA-55-7913, TCGA-67-4679
  • right_join 现在从 expression 中取出所有 570,并从 clinical2 中添加与 patientID 不匹配的 3,导致暗淡的 573 10
  • 相比之下left_joinleft_join():包括 x (=expression) 中的所有行,所以如果我们这样做
  anti_join(expression, clinical2, by=c("patient"="patientID"))

We get:
  # ... with 8 variables: sampleID <fct>, patient <chr>, type <chr>, A1BG <dbl>, A1CF <dbl>,
  #   A2BP1 <dbl>, A2LD1 <dbl>, A2ML1 <dbl>````

这意味着所有行都包含在表达式中。所以这里不会添加额外的行:

第一个回答: 加入时有两点很重要:

  1. 您从哪一方开始加入,例如table 排在第一位
  2. 给定 table 的位置,例如df1、df2 您应用的连接方法

看这个例子:

library(dplyr)
library(tibble)

# add ID
iris1<- iris %>% 
  tibble::rowid_to_column("ID")

# add ID
mtcars1 <- mtcars %>% 
  tibble::rowid_to_column("ID")

dim(iris1)
# [1] 150   6

dim(mtcars1)
# [1] 32 12

# 1. iris1 is first and we start from left e.g. iris1

a <- left_join(iris1, mtcars1, by="ID")
dim(a)
# [1] 150  17

# 2. iris1 is still first, but we join from right e.g. mtcars1
b <- right_join(iris1, mtcars1, by="ID")
dim(b)
# [1] 32 17

# 3. mtcars1 is first and we join from left e.g mtcars1
a1 <- left_join(mtcars1, iris1, by="ID")
dim(a1)
# [1] 32 17

-> b = a1 e.g. right_join(iris1, mtcars1, by="ID") = left_join(mtcars1, iris1, by="ID")

https://www.rdocumentation.org/packages/dplyr/versions/0.7.8/topics/join