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

Posted

技术标签:

【中文标题】在 R 中使用 dplyr 进行过滤时,为啥过滤掉的变量级别会保留在过滤后的数据中? [复制]【英文标题】:When filtering with dplyr in R, why do filtered out levels of a variable remain in filtered data? [duplicate]在 R 中使用 dplyr 进行过滤时,为什么过滤掉的变量级别会保留在过滤后的数据中? [复制] 【发布时间】:2015-11-10 14:50:57 【问题描述】:

我正在尝试使用 dplyr 包中的 filter 命令过滤掉一堆数据。一切似乎都如我所愿,但是当我尝试从新过滤的数据中绘制一些图表时,我过滤掉的所有级别都显示出来了(尽管没有值)。但是他们在那里的事实仍然使我的水平轴偏离了。

那么两个问题:

1) 为什么这些过滤后的级别仍在数据中?

2) 我如何过滤以使这些不再存在?

这是一个小例子,你可以运行看看我在说什么:

library(dplyr)
library(ggvis)

# small example frame
data <- data.frame(
  x = c(1:10),
  y = rep(c("yes", "no"), 5)
)

# filtering to only include data with "yes" in y variable
new_data <- data %>%
  filter(y == "yes")

levels(new_data) ## Why is "no" showing up as a level for this if I've filtered that out?

# Illustration of the filtered values still showing up on axis
new_data %>%
  ggvis(~y, ~x) %>%
  layer_bars()

感谢您的帮助。

【问题讨论】:

相关:***.com/questions/1195826/…. 【参考方案1】:

R 中的因子在过滤时不会自动降低级别。您可能认为这是一个愚蠢的默认设置(我确实如此),但它很容易处理——只需在结果上使用droplevels 函数即可。

new_data <- data %>%
  filter(y == "yes") %>%
  droplevels
levels(new_data$y)
## [1] "yes"

如果你一直这样做,你可以定义一个新函数

dfilter <- function(...) droplevels(filter(...))

【讨论】:

以上是关于在 R 中使用 dplyr 进行过滤时,为啥过滤掉的变量级别会保留在过滤后的数据中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

R Shiny Reactive 值,dplyr 过滤器错误?

在R中,如何使用dplyr按数据类型过滤数据帧?

使用dplyr在R中的所有列上应用iqr过滤器

在 R dplyr 中过滤具有多个条件名称匹配的数据框

Python 相当于 R 的 grepl 和 dplyr 过滤器 [重复]

R行数据过滤基于dplyr包filter函数