Условный поиск, сопоставление и замена значений между фреймами данных - PullRequest
1 голос
/ 23 марта 2019

У меня есть два кадра данных, как показано ниже. Я хотел бы заменить текст (ячейки) в фрейме данных на соответствующие значения, взятые из фрейма данных 2, когда есть совпадение. Я попытался привести простой пример ниже. У меня ограниченный опыт работы с R, но я не могу сразу найти легкое решение. Любая помощь / предложения будут высоко оценены.

input_1 = data.frame(col1 = c("ex1", "ex2", "ex3", "ex4"), 
                     col2 = c("A", "B", "C", "D"),
                     col3 = c("B", "E", "F", "D"))

input_2 = data.frame(colx = c("A", "B", "C", "D", "E", "F"), 
                coly = c(1, 2, 3, 4, 5, 6))

output = data.frame(col1 = c("ex1", "ex2", "ex3", "ex4"), 
                    col2 = c(1, 2, 3, 4),
                    col3 = c(2, 5, 6, 4))

Ответы [ 3 ]

1 голос
/ 23 марта 2019

Вот решение tidyverse :

library(tidyverse)
mutate_at(input_1, -1, ~deframe(input_2)[as.character(.)])
#   col1 col2 col3
# 1  ex1    1    2
# 2  ex2    2    5
# 3  ex3    3    6
# 4  ex4    4    4

deframe создает именованный вектор из фрейма данных, что более удобно в этом случае.

as.characterнеобходимо, так как у вас есть столбцы фактора

1 голос
/ 23 марта 2019

Пример использования Tidyverse.Мое решение включало слияние дважды с input_2, но сопоставление разных столбцов.Последний канал очищает фрейм данных и переименовывает столбцы.

library(tidyverse)

input_1 = data.frame(col1 = c("ex1", "ex2", "ex3", "ex4"), 
                     col2 = c("A", "B", "C", "D"),
                     col3 = c("B", "E", "F", "D"))

input_2 = data.frame(colx = c("A", "B", "C", "D", "E", "F"), 
                coly = c(1, 2, 3, 4, 5, 6))


output = data.frame(col1 = c("ex1", "ex2", "ex3", "ex4"), 
                    col2 = c(1, 2, 3, 4),
                    col3 = c(2, 5, 6, 4))


input_1 %>% inner_join(input_2, by = c("col2" = "colx")) %>%
    inner_join(input_2, by = c("col3" = "colx")) %>% 
    select(col1, coly.x, coly.y) %>%
    magrittr::set_colnames(c("col1", "col2", "col3"))
0 голосов
/ 23 марта 2019

Один из подходов, использующих основание R, заключался бы в цикле по столбцам, в которых мы хотим изменить значения, используя lapply, match значения с помощью input_2$colx и получить соответствующее значение coly.

input_1[-1] <- lapply(input_1[-1], function(x) input_2$coly[match(x, input_2$colx)])

input_1
#  col1 col2 col3
#1  ex1    1    2
#2  ex2    2    5
#3  ex3    3    6
#4  ex4    4    4

На самом деле вы можете уйти, не используя lapply, вы можете напрямую unlist значения и match

input_1[-1] <- input_2$coly[match(unlist(input_1[-1]), input_2$colx)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...