Package dplyr version 1.1.4
Parameters
R
filter(.data, ..., .by = NULL, .preverse = FALSE)
参数【.data】:一个数据集(data frame),数据集扩展(比如:tibble),或者 lazy data frames(比如:来自 dbplyr 或 dtplyr)。
参数【...】:数据过滤表达式(data-masking expression),返回的是逻辑值,根据参数【.data】中的变量进行定义。如果包含多个表达式,则使用**&运算符合并。++只保留所有条件判断均为 TRUE 的记录++**。
参数【.by】:<tidy-select>可选的,仅用于此操作的列分组选择,可替代 group_by()。
参数【.preserve】:与参数【.data】分组时相关。如果 .preserve = FALSE(默认值),分组结构将根据生成的数据重新计算,否则分组结构将保持不变。
Tips
**filter()**函数用于创建参数【.data】的子集行,将参数【...】中的表达式应用于列值,以确定应保留哪些行。它既可应用于分组数据,也可应用于未分组数据。然而,dplyr 还不够智能,无法优化不需要分组计算的分组数据集的过滤操作。因此,过滤未分组数据的速度通常要快得多。
Value
**filter()**函数返回一个与参数【.data】相同类型的对象。输出结果具有以下属性:
- 行是输入的子集,但以相同的顺序出现。
- 列未作修改。
- 组的数量可能会减少(如果参数【.preserve】不是 TRUE)。
- 数据集属性保留不变。
Available filter
在构建用于过滤数据的表达式时,有许多函数和运算符非常有用:
- ==,>,>= 等等
- &,|,!,xor()
- is.na()
- between(),near()
Process groups
由于**++过滤表达式是在组内计算的++**,因此在分组的 tibbles 上可能会产生不同的结果。只要涉及聚合、滞后或排序功能,就会出现这种情况。
比较一下未分组的过滤:
R
starwars %>% filter(mass > mean(mass, na.rm = TRUE))
再理解一下分组的过滤:
R
starwars %>% group_by(gender) %>% filter(mass > mean(mass, na.rm = TRUE))
在未分组版本中,**filter()**将每一行的 mass 值与全局平均值(整个数据集的平均值)进行比较,只保留 mass 大于全局平均值的行。与此相反,分组版本会分别计算每个 gender 组的平均 mass ,并保留 mass 大于相关性别内平均值的行。