是否可以filter
dplyr
列的位置?
我知道在没有dplyr
iris[iris[,1]>6,]
但我怎么能在dplyr中做到这一点?
谢谢!
答案 0 :(得分:7)
除了@thelatemail的建议外,您还可以使用filter_at
并将列号传递给vars
参数:
iris %>% filter_at(1, all_vars(. > 6))
all(iris %>% filter_at(1, all_vars(. > 6)) == iris[iris[,1] > 6, ])
# [1] TRUE
答案 1 :(得分:3)
没有魔力,只需使用上面的项目列号,而不是变量(列)名称:
library("magrittr")
library("dplyr")
iris %>%
filter(iris[,1] > 6)
其中@ eipi10评论为
更好iris %>%
filter(.[[1]] > 6)
答案 2 :(得分:2)
作用域动词(_if
、_at
、_all
)以及扩展名all_vars()
和any_vars()
已被across()
取代。在 filter
的情况下,已创建函数 if_any
and if_all
以组合跨多个列的逻辑以帮助进行子集化:
if_any() 和 if_all() 用于将相同的谓词函数应用于选定的列,并将结果组合成单个逻辑向量。
across
、if_any
和 if_any
的第一个参数仍然是列选择的 tidy-select 语法,包括按列位置选择。
单列
在您的单列情况下,您可以使用相同的结果执行任何操作:
iris %>%
filter(across(1, ~ . > 6))
iris %>%
filter(if_any(1, ~ . > 6))
iris %>%
filter(if_all(1, ~ . > 6))
多列
如果您在多个列中应用谓词函数或公式,那么 across
可能会产生意外结果,在这种情况下,您应该使用 if_any
和 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
注意这会返回所有选定列的值大于 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
为了让这个例子更紧凑,上面的输出被缩短了。