为什么使用这两个数据帧的 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!
分步说明:
right_join()
的定义:包括y
中的所有行(y
在这里clinical2
)。
- 这样做:
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_join
:
left_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>````
这意味着所有行都包含在表达式中。所以这里不会添加额外的行:
第一个回答:
加入时有两点很重要:
- 您从哪一方开始加入,例如table 排在第一位
- 给定 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
我正在通过本课程中的练习学习如何使用 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!
分步说明:
right_join()
的定义:包括y
中的所有行(y
在这里clinical2
)。- 这样做:
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_join
:left_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>````
这意味着所有行都包含在表达式中。所以这里不会添加额外的行:
第一个回答: 加入时有两点很重要:
- 您从哪一方开始加入,例如table 排在第一位
- 给定 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