按因子过滤后如何丢弃未使用的级别? [复制]

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

【讨论】:

非常感谢! while filter()ing 有没有办法做到这一点? @ils 我猜filter 没有论据来降低级别(据我所知)。

以上是关于按因子过滤后如何丢弃未使用的级别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中使用 dplyr 进行过滤时,为啥过滤掉的变量级别会保留在过滤后的数据中? [复制]

如何将过滤后的 jTable 的内容导出到 pdfpTable

分组后如何按父值过滤结果?

在过滤R data.frames时更新因子水平[重复]

在kafka connect中按某个值过滤记录

如何按值过滤字典? [复制]