Предполагается, что вопрос заключается в том, как установить уровни всех или указанных столбцов факторов в кадре данных, чтобы они были объединением их уровней.
Предположим, у нас есть DF
(показано в конце в примечании) с несколькими факторными и нефакторными столбцами.
1) База R Сначала вычислите is.fac
, чтобы он представлял собой логический вектор, определяющий, какие столбцы являются факторами. (Если вы хотите установить некоторые из столбцов фактора, тогда установите is.fac
вручную - is.fac может быть логическим вектором с одним элементом на столбец или целочисленным вектором индексов столбцов, которые должны быть обработаны, или это может быть символьный вектор интересующих имен столбцов. Например, если мы хотим рассмотреть только первые два столбца, мы можем установить is.fac <- 1:2
или is.fac <- c("A", "B")
.)
Затем используйте Reduce
, чтобы получить объединение их уровней, levs
. Если порядок уровней имеет значение, тогда сортируйте levs
, скажем.
Наконец установите уровни каждого фактора на levs
.
is.fac <- sapply(DF, is.factor)
levs <- Reduce(union, lapply(DF[is.fac], levels), init = NULL)
fix_levs <- function(x, levs) factor(as.character(x), levels = levs)
DF2 <- replace(DF, is.fac, lapply(DF[is.fac], fix_levs, levs))
Мы видим, что уровни столбцов факторов одинаковы. Например, обратите внимание, что «c» появляется в DF
как 3-й уровень в DF$A
, второй уровень в DF$B
и первый уровень в DF$C
, но «c» постоянно отображается как третий уровень во всех трех столбцы в DF2
.
DF$A
## [1] a b c
## Levels: a b c
DF$B
## [1] b c d
## Levels: b c d
DF$C
## [1] c d e
## Levels: c d e
DF2$A
## [1] a b c
## Levels: a b c d e
DF2$B
## [1] b c d
## Levels: a b c d e
DF2$C
## [1] c d e
## Levels: a b c d e
2) символ Другая возможность - просто использовать символьные столбцы. Тогда нам не нужно беспокоиться о том, одинаковые ли уровни или нет. Используя is.fac
сверху:
DF3 <- replace(DF, is.fac, lapply(DF[is.fac], as.character))
3) forcats Для этой цели в пакете forcats есть fct_unify
. Используя is.fac
сверху:
library(forcats)
DF4 <- replace(DF, is.fac, fct_unify(DF[is.fac]))
Примечание
Мы использовали следующий тестовый фрейм данных:
DF <- data.frame(A = letters[1:3], B = letters[2:4], C = letters[3:5], D = 1:3)