#r #dataframe #tidyverse
#r #фрейм данных #tidyverse
Вопрос:
У меня есть два фрейма данных, как показано ниже. Я хотел бы заменить текст (ячейки) в фрейме данных 1 соответствующими значениями, взятыми из фрейма данных 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))
Ответ №1:
Вот решение 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
необходимо, поскольку у вас есть столбцы факторов
Ответ №2:
Пример использования 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"))
Ответ №3:
Одним из подходов с использованием базового 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)]