Объединить и заменить значения в фрейме данных значениями из другого фрейма данных в R - PullRequest
2 голосов
/ 10 апреля 2020

У меня есть два кадра данных: DF1 и DF2, я хочу заменить значения из моего DF1 на значения из моего DF2.

DF1:

> DF1 <- data.frame(V1=c("AA23", "AA34", "AA54", "BB32", "CC43", "DD32"), V2=c("BB32", NA,"CC43", NA, "DD32", "EE22"), V3=c("CC43", "DD32", NA, NA, "AA54", "EE54"))
> DF1
    V1   V2   V3
1 AA23 BB32 CC43
2 AA34 <NA> DD32
3 AA54 CC43 <NA>
4 BB32 <NA> <NA>
5 CC43 DD32 AA54
6 DD32 EE22 EE54

DF2:

    > DF2 <- data.frame(col1=c("AA23", "AA34", "AA54", "BB32", "CC43", "DD32", "EE22", "EE54", "EE55"), col2=c("a22", "a23", "a25", "a27", "b11", "b13", "b15", "c11", "c13"))
> DF2
  col1 col2
1 AA23  a22
2 AA34  a23
3 AA54  a25
4 BB32  a27
5 CC43  b11
6 DD32  b13
7 EE22  b15
8 EE54  c11
9 EE55  c13

Я хотел бы заменить все значения из всех столбцов в моем DF1 (сохраняя NA) на значения в моем DF2 $ col2.

Это мой DF_final:

    > DF_final
   V1   V2   V3
1 a22  a27  b11
2 a23 <NA>  b13
3 a25  b11 <NA>
4 a27 <NA> <NA>
5 b11  b13  a25
6 b13  b15  c11

Пожалуйста, кто-нибудь может мне посоветовать? Спасибо.

Ответы [ 2 ]

3 голосов
/ 10 апреля 2020

Мы можем использовать именованный вектор и сопоставить

library(data.table)
setDT(DF1)[, lapply(.SD, function(x) 
     setNames(as.character(DF2$col2), DF2$col1)[as.character(x)])]
#   V1   V2   V3
#1: a22  a27  b11
#2: a23 <NA>  b13
#3: a25  b11 <NA>
#4: a27 <NA> <NA>
#5: b11  b13  a25
#6: b13  b15  c11

Или в base R

DF1[] <- lapply(DF1, function(x) 
     setNames(as.character(DF2$col2), DF2$col1)[as.character(x)])

Или преобразовать в matrix и выполнить сопоставление`

DF1[] <- setNames(as.character(DF2$col2), DF2$col1)[as.matrix(DF1)]
1 голос
/ 11 апреля 2020

Вот еще один базовый вариант R, использующий match + unlist:

DF1[]<-DF2$col2[match(unlist(DF1),DF2$col1)]

, такой что

> DF1
   V1   V2   V3
1 a22  a27  b11
2 a23 <NA>  b13
3 a25  b11 <NA>
4 a27 <NA> <NA>
5 b11  b13  a25
6 b13  b15  c11
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...