【问题标题】:Why do results differ for dplyr left_join() and right_join() using these two dataframes为什么使用这两个数据帧的 dplyr left_join() 和 right_join() 结果不同
【发布时间】:2021-12-30 20:39:09
【问题描述】:

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

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

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

加载包:

library(rWSBIM1207)

然后在 R/RStudio 中通过键入以下内容加载数据帧文件“clinical2”和“表达式”:

data(clinical2)
data(expression)

任务是,首先: '使用 left_join 和 right_join 函数,通过患者参考连接表达式和临床 2 表。' 我是这样做的:

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

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

【问题讨论】:

  • 联机帮助讨论了两个联接之间的差异。讨论的哪一部分不清楚?
  • @Limey,这并没有真正解决这个问题,诚然,这个问题本来可以更清楚地提出,但我现在有了答案。

标签: r dplyr left-join right-join


【解决方案1】:

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

创建左连接

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 个患者 ID 在clinical2TCGA-55-7284, TCGA-55-7913, TCGA-67-4679
  • right_join 现在从 expression 中取出所有 570,并从 clinical2 添加不匹配的 3 个 patientID 导致 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. 您从哪一侧开始加入,例如哪个表在第一位
  2. 给定的表格位置,例如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

【讨论】:

  • 您提供的 dim(a) 和 dim(b) 值非常合理。在我提供的数据框示例中,dim(clinical2) 是 516 x 3,dim(expression) 是 570 x 8。dim(left_join) 是 570 x 10,这是有道理的。但是,dim(right_join) 是 573 x 10。这是为什么呢?我正在寻找关于我的具体示例中的 right_join 输出的解释,这在之前的帖子中没有得到解答。
  • 请看我的更新。简单的答案是,clinical2 中未包含在表达式中的 3 行被添加到新数据帧中,因为在这个星座中使用 right_join,我们从有 570 行的 expression 开始。来自表达式的 570 + 来自临床 2 的 3 个新的得到 573。
  • TarJae 这是一个非常清晰、出色的解释,并且揭示了一个新的 dplyr 术语 anti-join,我可以看到它的用处。我最初忽略的一件显而易见的事情是,在“表达式”数据集中,“患者”列有许多重复的 ID:&gt; length(unique(expression$patient)) [1] 513 而不是 570。“表达式”和“表达式”中的行数之间的差异因此临床2'很容易解释!
猜你喜欢
  • 1970-01-01
  • 2019-12-18
  • 2021-12-10
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多