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
告诉我Factor levels not equal
?
如何比较这两个因素水平是否相等?
解决方案
如果您使用原始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'
推荐阅读
- c# - uwp 紧凑覆盖在屏幕上的特定位置
- python - 为什么即使没有执行一些代码也会发生错误?
- powershell - PowerShell 使用属性文件安装 MSI
- python - 访问可编辑注释
- javascript - console.log 未打印到 Visual Studio Code 中的调试控制台
- excel - 是否可以在 Excel 中以编程方式调整字段列表窗口的大小?
- vb.net - 输入日期并保存到访问时 INSERT INTO 语句中的语法错误为什么?
- python-3.x - 如何迭代熊猫中的列标题和行值?
- python - 如何在不丢失信息的情况下使用形态断开相邻区域
- c# - 如何在 LinkedIn 自定义 URL 中传递 id