R 如何跨多个列使用正则表达式进行筛选?

R 如何跨多个列使用正则表达式进行筛选?,r,dplyr,R,Dplyr,我想过滤一个数据帧,以包括任何包含字符串“bean”的列的值以“black”开头或包含“vanilla”的行 我的代码看起来像这样 library(dplyr) df2 <- df1 %>% filter( if_any( .cols = contains('bean'), grepl( pattern = "^black*|*vanilla*", ignore.c

我想过滤一个数据帧,以包括任何包含字符串“bean”的列的值以“black”开头或包含“vanilla”的行

我的代码看起来像这样

  library(dplyr)
  df2 <- df1 %>%
    filter(
      if_any(
        .cols = contains('bean'),
        grepl(
          pattern = "^black*|*vanilla*",
          ignore.case = T,
          x = .
        )
      )
    )
运行
last\u error()

<error/dplyr_error>
Problem with `filter()` input `..1`.
x Problem with `across()` input `.fns`.
ℹ Input `.fns` must be NULL, a function, a formula, or a list of functions/formulas.
ℹ Input `..1` is `if_any(...)`.
Backtrace:
Run `rlang::last_trace()` to see the full context.
<error/dplyr_error>
Problem with `filter()` input `..1`.
x Problem with `across()` input `.fns`.
ℹ Input `.fns` must be NULL, a function, a formula, or a list of functions/formulas.
ℹ Input `..1` is `if_any(...)`.
Backtrace:
     █
  1. ├─`%>%`(...)
  2. ├─dplyr::filter(...)
  3. ├─dplyr:::filter.data.frame(...)
  4. │ └─dplyr:::filter_rows(.data, ...)
  5. │   ├─base::withCallingHandlers(...)
  6. │   └─mask$eval_all_filter(dots, env_filter)
  7. ├─dplyr::if_any(...)
  8. │ └─dplyr::across(...)
  9. │   └─dplyr:::across_setup(...)
 10. │     └─dplyr:::across_setup_impl(...)
 11. │       └─rlang::abort(c("Problem with `across()` input `.fns`.", i = "Input `.fns` must be NULL, a function, a formula, or a list of functions/formulas."))
 12. │         └─rlang:::signal_abort(cnd)
 13. │           └─base::signalCondition(cnd)
 14. └─(function (e) ...
我们需要一个lambda函数(
~
),因为
x
。在模式中使用
*
意味着零个或多个字符。不知道OP是不是真的这么想的

library(dplyr) # version 1.0.4
df1 %>%
filter(
  if_any(
    .cols = contains('bean'),
    ~ grepl(
      pattern = "^black*|*vanilla*",
      ignore.case = TRUE,
      x = .
    )
  )
)
-输出

#   bean_1 bean_2 col3
#1   black velvet    1
#2 vanilla    red    4
#  bean_1 bean_2 col3
#1   black velvet    1
#2 vanilla    red    4

或者,如果我们不指定
x
,OP的当前代码将起作用,因为它已经将
模式
忽略.case
指定为命名参数

df1 %>%
 filter(
  if_any(
    .cols = contains('bean'),
    grepl,
      pattern = "^black*|*vanilla*",
      ignore.case = TRUE
     
    
  )
)
-输出

#   bean_1 bean_2 col3
#1   black velvet    1
#2 vanilla    red    4
#  bean_1 bean_2 col3
#1   black velvet    1
#2 vanilla    red    4
数据
df1 tilda是什么意思?@Username抱歉,他不在。
~
是tidyverse中函数(x)
的缩写形式。它可以写成
function(x)grepl(pattern=“^black*|*vanilla*”,ignore.case=TRUE,x=x)
,这是一个lamdba/匿名函数