r - 如何比较不同阶数的因子水平?

标签 r

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告诉我因子水平不相等

如何比较这2个因素水平是否相等?

最佳答案

如果您使用原始的 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'

关于r - 如何比较不同阶数的因子水平?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55489393/

相关文章:

r - 图片未显示在 Shiny 应用程序 R 中

r - `UseMethod()` vs `继承(R中的)` to determine an object'的类

r - 构造一个循环函数,并且应用不起作用。

r - 调整ggplot2和plotly中绘图的高度

r - 循环遍历文件夹并查找 R 中的特定文件

r - 创建列出不同观察结果的列

java - rJava .jnew java.lang.NoSuchMethodError

r - 使用 tidyverse 清理排名选择调查

r - do.call 和 order 将每一行按矩阵的降序排序?

r - 使用 fill 有条件地填充 NA 值,无需循环