#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