Как создать факторную переменную на основе уровней одной и той же переменной в другом фрейме данных

#r #factors

Вопрос:

У меня есть два фрейма данных: main_df это основная таблица. addl_df это столик поменьше.

ЦЕЛЬ: преобразовать все символьные переменные в addl_df факторы с теми же уровнями, что и символьные переменные с теми же именами main_df .

 main_df <- data.frame(id=c(1, 2, 3, 4, 5), age=c(10, 20, 30, 40, 45), gender=c("F","F","M","M","F"), city=c("A","B","C","D","D"))
addl_df <- data.frame(id=c(7,8), age=c( 40, 45), gender=c("F","F"), city=c("C","D"))
 

Используя приведенный ниже код, city вы получите факторную переменную с 2 уровнями («C» и » D). Что я хочу, так это чтобы фактор с 4 уровнями «А»,»В»,»С»,»D» с «С» имел значение 3 (такое же, как определено в main_df ).

Возможно ли это сделать автоматизированным способом (вместо того, чтобы вручную определять переменную по одному? Спасибо!

 main_df[sapply(main_df, is.character)] <- lapply(main_df[sapply(main_df, is.character)], as.factor) 
addl_df[sapply(addl_df, is.character)] <- lapply(addl_df[sapply(addl_df, is.character)], as.factor)
 

введите описание изображения здесь

Ответ №1:

Одним из вариантов является привязка наборов данных с bind_rows помощью , при создании идентификатора данных («grp»), преобразование character столбцов в factor , выполнение a group_split с помощью » grp » в a list из data.frames, затем установка имен list с setNames и обновление исходных объектов с помощью list2env

 library(dplyr)
bind_rows(main_df, addl_df, .id = 'grp') %>% 
    mutate(across(where(is.character), factor)) %>%
    group_split(grp, .keep = FALSE) %>%
    setNames(c('main_df', 'addl_df')) %>%
    list2env(.GlobalEnv)
 

-выход

 > str(main_df)
tibble [5 × 4] (S3: tbl_df/tbl/data.frame)
 $ id    : num [1:5] 1 2 3 4 5
 $ age   : num [1:5] 10 20 30 40 45
 $ gender: Factor w/ 2 levels "F","M": 1 1 2 2 1
 $ city  : Factor w/ 4 levels "A","B","C","D": 1 2 3 4 4
> str(addl_df)
tibble [2 × 4] (S3: tbl_df/tbl/data.frame)
 $ id    : num [1:2] 7 8
 $ age   : num [1:2] 40 45
 $ gender: Factor w/ 2 levels "F","M": 1 1
 $ city  : Factor w/ 4 levels "A","B","C","D": 3 4