在dplyr中跨列筛选

3
我希望能使用filter和across函数,将鸢尾花数据框中"sepal.length"、"sepal.width"、"petal.length"和"petal.width"这四个字段中大于2的行筛选出来。以下是我的代码:
iris%>%
  filter(across(c(Sepal.Length, Sepal.Width , Petal.Length, Petal.Width), >2))

错误信息显示:存在错误:Error: unexpected '>' in:

请问有没有人能够提出修改代码的建议来解决这个问题?
4个回答

4

一个基于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))

3
两种可能性
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风格,第二个是经典风格(我们称之为 classic style)。Purrr风格只适用于一些包。

现在来看第一个示例——across()希望作为其第二个参数的是一个函数,但你需要使用前缀形式(Advanced R)中的函数。R中的所有函数都有这种形式,但通常不必使用它,例如:

2 + 2
`+`(2, 2)

相同。

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


1
一种使用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))

0

更新后的 dplyr(>= 1.0.8)解决方案如下:

library(dplyr)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接