Вы можете написать свою функцию для перекодирования уровней - самый простой способ сделать это, вероятно, изменить уровни напрямую с помощью levels(fac) <- list(new_lvl1 = c(old_lvl1, old_lvl2), new_lvl2 = c(old_lvl3, old_lvl4))
Но уже есть несколько функций, которые делают это из коробки. Обычно я использую пакет forcats
для управления факторами.
Извлечение fct_recode
из пакета forcats
. Ссылка для выполнения c.
Есть и другие функции, которые могут вам помочь - ознакомьтесь с комментариями ниже.
Теперь о том, почему ваш код не ' t работает:
df$col
ищет столбец с буквальным названием col
. Обходной путь должен сделать df[[col]]
вместо. - Не забудьте вернуть
df
в конце вашей функции c(source = target)
создаст вектор с одним элементом с именем "source"
независимо от того, что происходит в переменной source
. Решение состоит в том, чтобы создать вектор c(source = target)
в 2 этапа.
revalue_factor_levels <- function(df, col, source, target) {
to_rename <- target
names(to_rename) <- source
df[[col]] <- revalue(df[[col]], to_rename)
df
}
Возврат df означает, что синтаксис:
data <- revalue_factor_levels(data, "lg_with_children", "Mandarin", "Other")
Мне нравятся функции, которые принимают данные в качестве первого аргумента и возвращают измененные данные, потому что они являются конвейерными.
library(dplyr)
data <- data %>%
revalue_factor_levels("lg_with_children", "Mandarin", "Other") %>%
revalue_factor_levels("lg_with_children", "Half and half", "Other") %>%
revalue_factor_levels("lg_with_children", "N/A", "Other")
Тем не менее, использование forcats
проще и менее подвержено взлому в крайних случаях.
Редактировать:
Ничто не мешает вам использовать forcats
и создавать собственные функции. Например, это ближе к тому, что вы хотите достичь:
revalue_factor_levels <- function(df, col, ref_level) {
df[[col]] <- forcats::fct_others(df[[col]], keep = ref_level)
df
}
# Will keep Shanghaisese and revalue other levels to "Other".
data <- revalue_factor_levels(data, "lg_with_children", "Shanghainese")