子集数据框中的下降因子水平

我有一个数据框包含一个因素。 当我使用subset()或其他索引函数创建此数据框的subset() ,会创建一个新的数据框。 但是,因子变量保留了所有原始级别 - 即使它们不存在于新数据框中。

这会在进行多面绘图或使用依赖于因子级别的函数时造成麻烦。

在我的新数据框架中从一个因素中删除层次的最简洁的方法是什么?

这是我的例子:

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    

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

你所需要做的就是在子集化之后再次将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)

自R版本2.12以来,有一个droplevels()函数。

levels(droplevels(subdf$letters))

如果你不想要这种行为,不要使用因素,而要使用字符向量。 我认为这比以后补丁更有意义。 在使用read.tableread.csv加载数据之前,请尝试以下read.csv

options(stringsAsFactors = FALSE)

缺点是你只能按字母排序。 (重新排序是你的情节的朋友)

链接地址: http://www.djcxy.com/p/70889.html

上一篇: Drop factor levels in a subsetted data frame

下一篇: Android SIP with CSipSimple and pjsip