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

R - mutate with regex in a loop

我有一个数据框,其中每一列都由数字和文本组成,例如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])'))
}

但是returns一个错误:

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

我认为 mutate_all() 也行不通,bcos str_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])'))