在dplyr中跨列过滤

6psbrbz9  于 2023-05-04  发布在  其他
关注(0)|答案(4)|浏览(147)

我想过滤iris Dataframe ,只返回萼片中值大于2的行。长度,萼片。宽度,花瓣。长度和花瓣。宽度字段使用过滤器和跨函数。我有下面的代码:

iris%>%
  filter(across(c(Sepal.Length, Sepal.Width , Petal.Length, Petal.Width), >2))

错误消息是:Error: unexpected '>' in:
有人能建议修改代码来解决这个问题吗?

6l7fqoea

6l7fqoea1#

基于dplyr的可能解决方案:

library(dplyr)

iris%>%
  filter(across(is.numeric, ~ .x > 2))

或者:

iris%>%
  filter(across(c(Sepal.Length,Sepal.Width,Petal.Length,Petal.Width), ~ .x > 2))

或者甚至:

iris%>%
  filter(across(ends_with(c("Length","Width")), ~ .x > 2))
oug3syen

oug3syen2#

两种可能

iris %>%
  filter(across(c(Sepal.Length, Sepal.Width , Petal.Length, Petal.Width), `>`, 2))
iris %>%
  filter(across(c(Sepal.Length, Sepal.Width , Petal.Length, Petal.Width), ~ .x > 2))

# or

iris %>%
  filter(across(c(Sepal.Length, Sepal.Width , Petal.Length, Petal.Width), function(x) x > 2))

让我们从第二个例子开始-我们使用匿名函数表示法,第一个是purrr的风格,第二个是,让我们称之为经典风格。Purrr的风格只适用于某些软件包。
现在第一个-across()想要作为第二个参数的是一个函数,但您需要使用前缀形式的函数Advanced R。R中的所有函数都有这种形式,但通常没有必要使用它,例如:

2 + 2
`+`(2, 2)

是一样的。
across()中,当你传递(作为第二个参数)函数时,你可以在逗号后传递所有其他可以传递给这个函数的参数。对于>,第一个参数是,第一个数字,然后从iris得到值,第二个参数是数字2,i。即您选择用来检查列中值的数字。

kb5ga3dv

kb5ga3dv3#

使用dplyr的潜在解决方案:

iris %>% filter(Sepal.Length > 2 & Sepal.Width >2 & Petal.Length >2 & Petal.Width >2)

压缩版本:

iris %>% filter_at(vars(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width),all_vars(.>2))
cmssoen2

cmssoen24#

更新了dplyr(〉= 1.0.8)解决方案看起来像:

library(dplyr)

iris%>%
  filter(if_any(where(is.numeric), ~ .x > 2))

相关问题