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