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() 需要列名作为参数。
如果我们使用字符串,则转换为 sym
bol 并计算 (!!
),同时我们使用 (:=
)
进行赋值
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])'))
我有一个数据框,其中每一列都由数字和文本组成,例如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() 需要列名作为参数。
如果我们使用字符串,则转换为 sym
bol 并计算 (!!
),同时我们使用 (:=
)
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])'))