Когда значения столбца A совпадают, замените NA столбца значением столбца B - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь объединить два кадра данных на основе двух переменных (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 совпадал (то есть, чтобы заменить NA на Ensembl.ID, где это возможно)?

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Если Gene.ID df1 и Gene.ID df2 уникальны (идентификаторы в df1 не являются идентификаторами в df2), вы можете просто объединить

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

, затем использовать rbind ()

df <- rbind(df, df2)

PS. Я бы порекомендовал использовать data.table для обработки данных в будущем.Это очень интуитивно и быстрее.

0 голосов
/ 18 сентября 2018

Мы можем использовать na.locf из zoo

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"

Или используя full_join из dplyr

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...