小编典典

在子集数据框中删除未使用的因子水平

all

我有一个包含factor.
当我使用subset或其他索引函数创建此数据框的子集时,会创建一个新数据框。但是,该factor变量保留其所有原始级别,即使/如果它们不存在于新数据框中。

这在进行多面绘图或使用依赖于因子水平的函数时会导致问题。

从新数据框中的一个因素中删除级别的最简洁的方法是什么?

这是一个例子:

df <- data.frame(letters=letters[1:5],
                    numbers=seq(1:5))

levels(df$letters)
## [1] "a" "b" "c" "d" "e"

subdf <- subset(df, numbers <= 3)
##   letters numbers
## 1       a       1
## 2       b       2
## 3       c       3

# all levels are still there!
levels(subdf$letters)
## [1] "a" "b" "c" "d" "e"

阅读 231

收藏
2022-03-08

共1个答案

小编典典

您所要做的就是在子集后再次将 factor() 应用于您的变量:

> subdf$letters
[1] a b c
Levels: a b c d e
subdf$letters <- factor(subdf$letters)
> subdf$letters
[1] a b c
Levels: a b c

编辑

从因子页面示例:

factor(ff)      # drops the levels that do not occur

要从数据框中的所有因子列中删除级别,您可以使用:

subdf <- subset(df, numbers <= 3)
subdf[] <- lapply(subdf, function(x) if(is.factor(x)) factor(x) else x)
2022-03-08