50

给定以下模拟数据:

set.seed(123)
x <- data.frame(let = sample(letters[1:5], 100, replace = T), 
                num = sample(1:10, 100, replace = T))
y <- subset(x, let != 'a')

创建y$let收益率表

a  b  c  d  e 
0 20 21 22 18

但我不想a再展示了。如果我尝试这样做:

levels(y$let) <- factor(y$let)

我把频率弄乱了,因为现在table(y$let)给了我

b  d  c  e 
0 20 21 40 

我知道我可以xtabs(~ y$let, drop.unused.levels = T)解决这个问题,但它不会重置其核心的变量级别(这对我来说很重要,因为这是我对数据集所做的早期更改,它将在整个过程中进行整体分析)。此外,xtabs与 是不同的类table,这会让我在项目后期感到头疼。

问题是:如何自动更改levels(y$let),使其不显示创建子集时删除的级别?在这种情况下,我怎样才能让它显示[1] "b" "c" "d" "e"

4

4 回答 4

136

R 中最近为此添加了一个函数:

y <- droplevels(y)
于 2013-06-20T15:43:15.587 回答
23

做吧y$let <- factor(y$let)factor在现有因子变量上运行会将级别重置为仅存在的级别。

于 2013-06-20T15:42:03.010 回答
3

添加到 Hong Ooi 的答案中,这是我从 R-Bloggers 找到的一个示例。

# Create some fake data
x <- as.factor(sample(head(colors()),100,replace=TRUE))
levels(x)
x <- x[x!="aliceblue"]
levels(x) # still the same levels
table(x) # even though one level has 0 entries!

The solution is simple: run factor() again:
x <- factor(x)
levels(x)
于 2017-08-20T07:35:11.427 回答
2

用于处理因子的 forcats 包通常是一个不错的选择。

library(forcats)
y$let <- fct_drop(y$let)
于 2021-10-20T21:11:01.213 回答