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

ils*_*ils 9 r dplyr

以下是一个SO成员的例子.

# 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
Run Code Online (Sandbox Code Playgroud)

由此产生的df filter()保留了原始df的所有级别.

什么是放弃未使用的水平上,即推荐的方式"fall""others"中,内dplyr框架?

tal*_*lat 32

你可以这样做:

dat1 <- dat0 %>%
  filter(s == "spring") %>% 
  droplevels()
Run Code Online (Sandbox Code Playgroud)

然后

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
Run Code Online (Sandbox Code Playgroud)


akr*_*run 4

你可以使用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
Run Code Online (Sandbox Code Playgroud)