Как сравнить уровни факторов с разным порядком? - PullRequest
1 голос
/ 03 апреля 2019
df <- data.frame(
    cola = c('a','b','c','d','e','e','1',NA,'c','d'),
    colb = c("A",NA,"C","D",'a','b','c','d','c','d'),stringsAsFactors = FALSE)
#equal 2 dataframe
df2<-df

df['cola'] <- lapply(df['cola'], function(x) droplevels(factor(x,levels=c('a','b','c','d','e','f','1'),ordered = FALSE)))

df2['cola'] <- lapply(df2['cola'], function(x) factor(x,ordered = FALSE))

#should be eqaul
dplyr::all_equal(df,df2)

#check levels
levels(df$cola)
levels(df2$cola)

Вывод приведенного выше сценария:

> dplyr::all_equal(df,df2)
[1] "Factor levels not equal for column `cola`"

> levels(df$cola)
[1] "a" "b" "c" "d" "e" "1"

> levels(df2$cola)
[1] "1" "a" "b" "c" "d" "e"

Что касается ordered = FALSE, "a" "b" "c" "d" "e" "1" должно быть равно "1" "a" "b" "c" "d" "e"
Почему all_equalподскажите Factor levels not equal?

Как сравнить эти 2 факторных уровня, чтобы они были равны?

1 Ответ

1 голос
/ 03 апреля 2019

Причина становится понятнее, если вы используете оригинал all.equal.

all.equal(df, df2)
# [1] "Component “cola”: Attributes: < Component “levels”: 6 string mismatches >"

Ваши уровни просто не совпадают друг с другом.Это сжато для сравнения столбцов data.frame или двух строковых векторов:

all.equal(letters[c(3, 1, 2)], letters[c(2, 3, 1)])
# [1] "3 string mismatches"  

Вместо этого можно использовать sort.

sort(levels(df$cola)) == sort(levels(df2$cola))
# [1] TRUE TRUE TRUE TRUE TRUE TRUE

Чтобы проверить все, используйте all.

all(sort(levels(df$cola)) == sort(levels(df2$cola)))
# [1] TRUE

Вы можете заключить его в функцию.

checkEqualLevels <- function(l, x, y) {
  if (all(sort(levels(x[[l]])) == sort(levels(y[[l]]))))
    cat(paste0("Factor levels are equal for column ", "'", l, "'"))
  else
    cat(paste0("Factor levels not equal for column ", "'", l, "'"))
}
checkEqualLevels("cola", df, df2)
# Factor levels are equal for column 'cola'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...