按因子过滤后如何删除未使用的级别?

时间:2014-11-09 09:34:38

标签: r dplyr

以下是从a fellow SO member获取的示例。

# define a %not% to be the opposite of %in%
library(dplyr)
# data
f <- c("a","a","a","b","b","c")
s <- c("fall","spring","other", "fall", "other", "other")
v <- c(3,5,1,4,5,2)
(dat0 <- data.frame(f, s, v))
#  f      s v
#1 a   fall 3
#2 a spring 5
#3 a  other 1
#4 b   fall 4
#5 b  other 5
#6 c  other 2
(sp.tmp <- filter(dat0, s == "spring"))
#  f      s v
#1 a spring 5
(str(sp.tmp))
#'data.frame':  1 obs. of  3 variables:
# $ f: Factor w/ 3 levels "a","b","c": 1
# $ s: Factor w/ 3 levels "fall","other",..: 3
# $ v: num 5

filter()产生的df保留了所有原始df的水平。

"fall"框架内删除未使用级别(即"others"dplyr)的推荐方法是什么?

2 个答案:

答案 0 :(得分:25)

您可以执行以下操作:

dat1 <- dat0 %>%
  filter(s == "spring") %>% 
  droplevels()

然后

str(df)
#'data.frame':  1 obs. of  3 variables:
# $ f: Factor w/ 1 level "a": 1
# $ s: Factor w/ 1 level "spring": 1
# $ v: num 5

答案 1 :(得分:2)

您可以使用droplevels

 sp.tmp <- droplevels(sp.tmp)
 str(sp.tmp)
 #'data.frame': 1 obs. of  3 variables:
 #$ f: Factor w/ 1 level "a": 1
 #$ s: Factor w/ 1 level "spring": 1
# $ v: num 5