如何根据 R 中另一个数据集的条件替换特定行
How to replace specific rows based on conditions of another dataset in R
我有 2 个遗传数据集,如下所示:
数据集 1:
ID Chr Ref Alt
1:10000476 NA NA NA
1:10081736 NA NA NA
1:100829685 NA NA NA
1:100829720 NA NA NA
10:1008338 NA NA NA
数据集2:
ID Chr Ref Alt
1:10000476 1 A T
1:10081736 1 C G
2:133248 2 A T
3:300829720 3 A T
10:1008338 10 A T
我正在尝试用数据集 2 中的数据替换数据集 1 中的任何 NA,如果它们具有相同的 ID
正在尝试输出:
ID Chr Ref Alt
1:10000476 1 A T
1:10081736 1 C G
1:100829685 NA NA NA
1:100829720 NA NA NA
10:1008338 10 A T
#first 2 rows have their NAs replaced with the data in the 2nd dataset, as the IDs match
我有生物学背景,所以不确定从哪里开始,我的数据集还有更多列。到目前为止,我已经尝试使用 merge(df1, df2, by='ID', all.x=TRUE)
,但这是使用“.x”和“.y”创建列的 2 个版本 - 看起来我可以使用“.y”来获取列,但我不确定为什么首先会出现这种情况,也找不到信息来了解我是否可以信任它。任何正确方向的帮助将不胜感激。
输入数据:
#dataset1
dput(df1)
structure(list(ID = c("1:10000476", "1:10081736", "1:100829685",
"1:100829720", "1:100833868"), Chr = c(NA, NA, NA, NA, NA), Ref = c(NA,
NA, NA, NA, NA), Alt = c(NA, NA, NA, NA, NA)), row.names = c(NA,
-5L), class = c("data.table", "data.frame"))
#dataset2
dput(df2)
structure(list(ID = c("1:10000476", "1:10081736", "2:133248",
"3:300829720", "4:5543348"), Chr = c(1L, 1L, 2L, 3L, 4L), Ref = c("A",
"C", "A", "A", "A"), Alt = c("T", "G", "T", "T", "T")), row.names = c(NA,
-5L), class = c("data.table", "data.frame"))
使用 dplyr
的一个解决方案是
df1 %>%
left_join(df2, by = "ID", suffix = c("_to_be_removed", "")) %>%
select(-contains("_to_be_removed"))
输出
# ID Chr Ref Alt
# 1 1:10000476 1 A T
# 2 1:10081736 1 C G
# 3 1:100829685 NA <NA> <NA>
# 4 1:100829720 NA <NA> <NA>
# 5 1:100833868 NA <NA> <NA>
你可以这样做:
library(data.table)
df1[, c("Chr", "Ref", "Alt") := df2[.SD, on = "ID", .(Chr, Ref, Alt)]]
df1
ID Chr Ref Alt
1: 1:10000476 1 A T
2: 1:10081736 1 C G
3: 1:100829685 NA <NA> <NA>
4: 1:100829720 NA <NA> <NA>
5: 1:100833868 NA <NA> <NA>
我有 2 个遗传数据集,如下所示:
数据集 1:
ID Chr Ref Alt
1:10000476 NA NA NA
1:10081736 NA NA NA
1:100829685 NA NA NA
1:100829720 NA NA NA
10:1008338 NA NA NA
数据集2:
ID Chr Ref Alt
1:10000476 1 A T
1:10081736 1 C G
2:133248 2 A T
3:300829720 3 A T
10:1008338 10 A T
我正在尝试用数据集 2 中的数据替换数据集 1 中的任何 NA,如果它们具有相同的 ID
正在尝试输出:
ID Chr Ref Alt
1:10000476 1 A T
1:10081736 1 C G
1:100829685 NA NA NA
1:100829720 NA NA NA
10:1008338 10 A T
#first 2 rows have their NAs replaced with the data in the 2nd dataset, as the IDs match
我有生物学背景,所以不确定从哪里开始,我的数据集还有更多列。到目前为止,我已经尝试使用 merge(df1, df2, by='ID', all.x=TRUE)
,但这是使用“.x”和“.y”创建列的 2 个版本 - 看起来我可以使用“.y”来获取列,但我不确定为什么首先会出现这种情况,也找不到信息来了解我是否可以信任它。任何正确方向的帮助将不胜感激。
输入数据:
#dataset1
dput(df1)
structure(list(ID = c("1:10000476", "1:10081736", "1:100829685",
"1:100829720", "1:100833868"), Chr = c(NA, NA, NA, NA, NA), Ref = c(NA,
NA, NA, NA, NA), Alt = c(NA, NA, NA, NA, NA)), row.names = c(NA,
-5L), class = c("data.table", "data.frame"))
#dataset2
dput(df2)
structure(list(ID = c("1:10000476", "1:10081736", "2:133248",
"3:300829720", "4:5543348"), Chr = c(1L, 1L, 2L, 3L, 4L), Ref = c("A",
"C", "A", "A", "A"), Alt = c("T", "G", "T", "T", "T")), row.names = c(NA,
-5L), class = c("data.table", "data.frame"))
使用 dplyr
的一个解决方案是
df1 %>%
left_join(df2, by = "ID", suffix = c("_to_be_removed", "")) %>%
select(-contains("_to_be_removed"))
输出
# ID Chr Ref Alt
# 1 1:10000476 1 A T
# 2 1:10081736 1 C G
# 3 1:100829685 NA <NA> <NA>
# 4 1:100829720 NA <NA> <NA>
# 5 1:100833868 NA <NA> <NA>
你可以这样做:
library(data.table)
df1[, c("Chr", "Ref", "Alt") := df2[.SD, on = "ID", .(Chr, Ref, Alt)]]
df1
ID Chr Ref Alt
1: 1:10000476 1 A T
2: 1:10081736 1 C G
3: 1:100829685 NA <NA> <NA>
4: 1:100829720 NA <NA> <NA>
5: 1:100833868 NA <NA> <NA>