按因子过滤后如何丢弃未使用的级别? [复制]
Posted
技术标签:
【中文标题】按因子过滤后如何丢弃未使用的级别? [复制]【英文标题】:How to drop unused levels after filtering by factor? [duplicate] 【发布时间】:2015-01-05 18:10:19 【问题描述】:这是取自 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 的级别。
在dplyr
框架内删除未使用级别(即"fall"
和"others"
)的推荐方法是什么?
【问题讨论】:
我一直在使用电子表格进行数据预处理,但是自从我发现dplyr
之后,这似乎已经改变了 ;-) 但是,当在电子表格中应用过滤器时,“隐藏" 对于复制/粘贴操作,范围似乎不存在。这就是为什么我在应用filter()
后发现过滤后的内容部分转移到了新的df 时感到惊讶的原因。因此,我询问如何在dplyr
框架内在 内获得相同的效果,并期望可能会有这样的论点。
现在可以完全删除这个问题吗?
如果它会整理环境,我会很乐意这样做。希望两位助手都不会介意否决...
我想他们会...
保持原样。答案显示了dplyr
上的一些额外实现
【参考方案1】:
你可以这样做:
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
【讨论】:
谢谢!这似乎是一种合乎逻辑的方法。【参考方案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
【讨论】:
非常感谢! whilefilter()
ing 有没有办法做到这一点?
@ils 我猜filter
没有论据来降低级别(据我所知)。以上是关于按因子过滤后如何丢弃未使用的级别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
在 R 中使用 dplyr 进行过滤时,为啥过滤掉的变量级别会保留在过滤后的数据中? [复制]