Быстрый метод в R получения значения из одного столбца на основе искомого значения в другом? - PullRequest
1 голос
/ 28 июня 2019

У меня есть два фрейма данных, один из которых имеет большой список из двух идентификаторов:

rsid uniq_id
rs796086906 1_13868_G_A
rs546169444 1_14464_T_A
rs6682375 1_14907_G_A
rs6682385 1_14930_G_A

И тот, который содержит один из двух идентификаторов:

V1 V2 V3 V4 V5 V6
1    1_10439_A_AC  0 10439  A    AC
1    1_13417_CGAGA_C  0 13417  C CGAGA
1    1_14907_G_A  0 14907  G     A

То, что я хочу, это заменить идентификатор во втором кадре данных соответствующим вторым идентификатором из первого кадра данных (я также не мог придумать краткий способ сформулировать это для заголовка этого вопроса, поэтому, почему он так неловко сформулирован) и почему я не смог найти дубликаты). I.e.:

V1 V2 V3 V4 V5 V6
1    1_10439_A_AC  0 10439  A    AC
1    1_13417_CGAGA_C  0 13417  C CGAGA
1    rs6682375  0 14907  G     A

Мое решение в настоящее время - использовать цикл for ... if следующим образом:

for (x in 1:nrow(df2)){

    if (df2$V2[x] %in% df1$uniq_id){

        df2$V2[x] = df1$rsid[x]
    }
}

Однако, поскольку оба файла чрезвычайно велики, я считаю, что это, вероятно, очень неэффективный способ сделать это, и мне интересно, есть ли более быстрый метод.

Кто-то предположил, что использование функции match() может быть быстрее, но, учитывая, что документация R для этого предполагает, что %in% на самом деле более интуитивно понятен, и моя неопытность в этом, я не уверен, как применить его в по-другому.

Любая помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 28 июня 2019

Это объединение обновлений в терминологии data.table.Предполагая, что первая таблица называется df, а вторая - df2:

library(data.table)
setDT(df)
setDT(df2)

df2[df, on = .(V2 = uniq_id), V2 := rsid]

df2
#    V1              V2 V3    V4 V5    V6
# 1:  1    1_10439_A_AC  0 10439  A    AC
# 2:  1 1_13417_CGAGA_C  0 13417  C CGAGA
# 3:  1       rs6682375  0 14907  G     A

Используемые данные

df <- fread('
rsid uniq_id
rs796086906 1_13868_G_A
rs546169444 1_14464_T_A
rs6682375 1_14907_G_A
rs6682385 1_14930_G_A
')
df2 <- fread('
V1 V2 V3 V4 V5 V6
1    1_10439_A_AC  0 10439  A    AC
1    1_13417_CGAGA_C  0 13417  C CGAGA
1    1_14907_G_A  0 14907  G     A
')
1 голос
/ 28 июня 2019

Метод с использованием базы r. Также было бы легко выполнить это, используя dplyr, и при желании это функция left_join.

df <- data.table::fread('
rsid uniq_id
rs796086906 1_13868_G_A
rs546169444 1_14464_T_A
rs6682375 1_14907_G_A
rs6682385 1_14930_G_A
')
df2 <- data.table::fread('
V1 V2 V3 V4 V5 V6
1    1_10439_A_AC  0 10439  A    AC
1    1_13417_CGAGA_C  0 13417  C CGAGA
1    1_14907_G_A  0 14907  G     A
')

df2 <- merge(df2,df,by.x = c("V2"),by.y = c("uniq_id"),all.x = TRUE)
df2$V2 <- ifelse(!is.na(df2$rsid),df2$rsid,df2$V2)
df2$rsid <- NULL

df2

#                 V2 V1 V3    V4 V5    V6
# 1:    1_10439_A_AC  1  0 10439  A    AC
# 2: 1_13417_CGAGA_C  1  0 13417  C CGAGA
# 3:       rs6682375  1  0 14907  G     A
...