【问题标题】:When column A values match, replace column B NAs with column B value当 A 列值匹配时,将 B 列 NA 替换为 B 列值
【发布时间】:2018-09-18 15:13:03
【问题描述】:

我正在尝试基于两个变量(Entrez.ID 和 Gene.ID)合并两个数据框。一个数据框只有这些变量,例如

Entrez.ID  Gene.ID
10007      GNPDA1
10016      ALG2
10044      SH2D3C 

和一个具有三个变量的数据框,例如

Entrez.ID    Gene.ID   Ensembl.ID
10007        GPI       ENSG00000113552
10016        PDCD6     ENSG00000249915
10044        CHAT      ENSG00000095370

目前当我使用以下方式合并文件时:

df<-merge(df1,df2,by=c("Entrez.ID","Gene.ID"),all=TRUE)

我得到一个看起来像这样的数据框:

Entrez.ID   Gene.ID   Ensembl.ID
10007       GNPDA1    <NA>
10007       GPI       ENSG00000113552
10016       ALG2      <NA>
10016       PDCD6     ENSG00000249915
10044       SH2D3C    <NA>
10044       CHAT      ENSG00000095370

但我想要创建的是一个看起来像这样的数据框:

Entrez.ID   Gene.ID   Ensembl.ID
10007       GNPDA1    ENSG00000113552
10007       GPI       ENSG00000113552
10016       ALG2      ENSG00000249915
10016       PDCD6     ENSG00000249915
10044       SH2D3C    ENSG00000095370
10044       CHAT      ENSG00000095370

我如何告诉 R Entrez.ID 变量匹配的位置,我希望 Ensembl.ID 匹配(即在可用的情况下用 Ensembl.ID 替换 NA)?

【问题讨论】:

    标签: r merge pattern-matching na


    【解决方案1】:

    我们可以从zoo使用na.locf

    library(zoo)
    df$Ensembl.ID <- with(df, ave(Ensembl.ID, Entrez.ID, FUN = function(x)
            na.locf(na.locf(x, na.rm = FALSE), fromLast = TRUE)))
    df$Ensembl.ID
    #[1] "ENSG00000113552" "ENSG00000113552" "ENSG00000249915" 
    #[4] "ENSG00000249915" "ENSG00000095370"
    #[6] "ENSG00000095370"
    

    或者使用来自dplyrfull_join

    library(tidyverse)
    full_join(df1, df2, by = c("Entrez.ID","Gene.ID")) %>%
        group_by(Entrez.ID) %>%
        fill(Ensembl.ID, .direction = 'up') %>%
        fill(Ensembl.ID, .direction = 'down')
    # A tibble: 6 x 3
    # Groups:   Entrez.ID [3]
    #  Entrez.ID Gene.ID Ensembl.ID     
    #      <int> <chr>   <chr>          
    #1     10007 GNPDA1  ENSG00000113552
    #2     10007 GPI     ENSG00000113552
    #3     10016 ALG2    ENSG00000249915
    #4     10016 PDCD6   ENSG00000249915
    #5     10044 SH2D3C  ENSG00000095370
    #6     10044 CHAT    ENSG00000095370
    

    数据

    df <- structure(list(Entrez.ID = c(10007L, 10007L, 10016L, 10016L, 
    10044L, 10044L), Gene.ID = c("GNPDA1", "GPI", "ALG2", "PDCD6", 
    "SH2D3C", "CHAT"), Ensembl.ID = c(NA, "ENSG00000113552", NA, 
    "ENSG00000249915", NA, "ENSG00000095370")), class = "data.frame", 
     row.names = c(NA, -6L))
    

    【讨论】:

    • 我尝试了来自 dplyr 解决方案的 full_join,它成功了 - 谢谢!
    【解决方案2】:

    如果df1的Gene.ID和df2的Gene.ID是唯一的(df1中的ID不是df2中的ID),可以简单的合并

    df <- merge(df1,df2,by=c("Entrez.ID"),all.x=TRUE)
    

    然后使用 rbind()

    df <- rbind(df, df2)
    

    PS.我建议将来使用 data.table 进行数据整理。它非常直观且速度更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 2023-01-19
      • 2018-06-18
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      • 2020-08-23
      相关资源
      最近更新 更多