如何根据 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>