子集数据框中的下降因子水平
我有一个数据框包含一个因素。 当我使用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.table
或read.csv
加载数据之前,请尝试以下read.csv
:
options(stringsAsFactors = FALSE)
缺点是你只能按字母排序。 (重新排序是你的情节的朋友)
链接地址: http://www.djcxy.com/p/70889.html