【问题标题】:How to replace specific rows based on conditions of another dataset in R如何根据R中另一个数据集的条件替换特定行
【发布时间】:2020-05-13 10:18:22
【问题描述】:

我有 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

如果数据集 1 中的任何 NA 具有相同的 ID,我将尝试将它们替换为数据集 2 中的数据

尝试输出:

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”创建两个版本的列 - 看起来我可以只使用“.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"))

【问题讨论】:

  • 您的“输入数据”与主帖中显示的不一样。

标签: r dataframe data.table bioinformatics


【解决方案1】:

你可以这样做:

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】:

    使用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>
    

    【讨论】:

      猜你喜欢
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 2019-01-31
      • 1970-01-01
      • 2020-06-08
      • 2021-02-05
      相关资源
      最近更新 更多