我有一个数据帧,其中每一列都由数字后面跟着文本组成,例如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((需要列名作为参数。
如果我们使用字符串,那么在使用(:=
(进行赋值时,转换为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])'))