R-在循环中使用正则表达式进行突变



我有一个数据帧,其中每一列都由数字后面跟着文本组成,例如533 234r/r

以下代码可以很好地去除文本:

my_data <- my_data %>%
mutate(column1 = str_extract(column1, '.+?(?=[a-z])'))

我想为多个专栏做这件事:

col_names <- names(my_data)
for (i in 1:length(col_names)) {
my_data <- my_data%>%
mutate(col_names[i] = str_extract(col_names[i], '.+?(?=[a-z])'))
}

但它返回一个错误:

Error: unexpected '=' in:
"  my_data <- my_data %>%
mutate(col_names[i] ="

我认为mutate_all((不能很好地工作,bcosstr_extract((需要列名作为参数。

如果我们使用字符串,那么在使用(:=(进行赋值时,转换为symbol并求值(!!(

library(dplyr)
library(stringr)
col_names <- names(my_data)
for (i in seq_along(col_names)) {
my_data <- my_data   %>%
mutate(!! col_names[i] := 
str_extract(!!rlang::sym(col_names[i]), '.+?(?=[a-z])'))
}

tidyverse中,我们可以使用across而不是使用for循环(dplyr版本>= 1.0(进行循环

my_data <- my_data %>%
mutate(across(everything(), ~ str_extract(., '.+?(?=[a-z])')))

如果dplyr版本旧,请使用mutate_all

my_data <- my_data %>%
mutate_all(~ str_extract(., '.+?(?=[a-z])'))

最新更新