dplyr过滤第一列

lok*_*art 3 r filter dplyr

是否有可能filterdplyr一个列的位置?

我知道怎么做就没有 dplyr

iris[iris[,1]>6,]

但我怎么能在dplyr中做到这一点?

谢谢!

Psi*_*dom 8

除了@thelatemail的建议外,您还可以使用filter_at并将列号传递给vars参数:

iris %>% filter_at(1, all_vars(. > 6))
Run Code Online (Sandbox Code Playgroud)
all(iris %>% filter_at(1, all_vars(. > 6)) == iris[iris[,1] > 6, ])
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)


LMc*_*LMc 7

深度 >= 1.0.0

范围动词 ( _if,, ) 以及扩展后的and已_at被取代。对于函数和 ,它被创建来组合多个列的逻辑以帮助子集化(这些动词在 dplyr >= 1.0.4 中可用):_allall_vars()any_vars()across()filterif_anyif_all

if_any() 和 if_all() 与 with 一起使用,将相同的谓词函数应用于选定的列,并将结果组合到单个逻辑向量中。

acrossif_any、 和 的第一个参数if_any仍然是用于列选择的整洁选择语法,其中包括按列位置进行选择。

单柱

单列情况下,您可以执行任何操作以获得相同的结果:

iris %>% 
  filter(across(1, ~ . > 6))

iris %>% 
  filter(if_any(1, ~ . > 6))

iris %>% 
  filter(if_all(1, ~ . > 6))
Run Code Online (Sandbox Code Playgroud)

多列

如果您跨多个列应用谓词函数或公式,则across可能会产生意外结果,在这种情况下您应该使用if_anyand if_all

iris %>% 
  filter(if_all(c(2, 4), ~ . > 2.3)) # by column position

  Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
1          6.3         3.3          6.0         2.5 virginica
2          7.2         3.6          6.1         2.5 virginica
3          5.8         2.8          5.1         2.4 virginica
4          6.3         3.4          5.6         2.4 virginica
5          6.7         3.1          5.6         2.4 virginica
6          6.7         3.3          5.7         2.5 virginica
Run Code Online (Sandbox Code Playgroud)

请注意,这将返回所有选定列的值都大于 2.3 的行,这是任何选定列满足逻辑的行的子集:

iris %>% 
  filter(if_any(ends_with("Width"), ~ . > 2.3)) # same columns selection as above

Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
1           5.1         3.5          1.4         0.2    setosa
2           4.9         3.0          1.4         0.2    setosa
3           4.7         3.2          1.3         0.2    setosa
4           4.6         3.1          1.5         0.2    setosa
5           5.0         3.6          1.4         0.2    setosa
6           6.7         3.3          5.7         2.5 virginica
7           6.7         3.0          5.2         2.3 virginica
8           6.3         2.5          5.0         1.9 virginica
9           6.5         3.0          5.2         2.0 virginica
10          6.2         3.4          5.4         2.3 virginica
11          5.9         3.0          5.1         1.8 virginica
Run Code Online (Sandbox Code Playgroud)

对于本示例,上面的输出被缩短以更加紧凑。


Uma*_*mao 6

没有魔法,只需使用上面的项目列号,而不是变量(列)名称:

library("dplyr")

iris %>%
  filter(iris[,1] > 6)
Run Code Online (Sandbox Code Playgroud)

正如@eipi10 评论的那样更好

iris %>%
  filter(.[[1]] > 6)
Run Code Online (Sandbox Code Playgroud)

  • 可能应该是`filter(.[,1] > 6)`。这里无关紧要,但一般来说,如果您在过滤器之前使用其他管道函数更改了初始数据框,`filter(iris[,1] > 6)` 将到达管道外的原始数据框,而不是使用管道数据帧。 (4认同)
  • 举个例子,这两者没有可比性 - `iris %>% mutate(Sepal.Length=0) %>% filter(iris[,1] > 6)` vs `iris %>% mutate(Sepal.Length= 0) %>% 过滤器(.[,1] > 6)` (2认同)