遍历模式列表以从 R 中的字符串列中删除它们

Looping over patterns list to remove them for a string column in R

我有一个包含 2 列的 df,其中第二列表示包含特殊字符和我要删除的其他字符的字符串。

问题

我写了一个 for 循环,但只有在执行三 (03) 次后才有效!

图书馆和数据

library(tidyverse)
client_id <- 1:10 
client_name <- c("name5", "-name", "name--", "name-µ", "name²", "name31", "7name8", "name514", "²name8")
df <- data.frame(cbind(client_id, client_name))

要删除的模式

patterns <- list("-", "--", "[:digit:]", "[:cntrl:]" , "µ" , "²" , "[:punct:]")

我做了什么

要删除第 2 列中不需要的模式 client_names 我编写了以下 for 循环:

for(ptrn in patterns) {
    df <- df %>% 
      mutate(client_name = str_remove(df$client_name, ptrn))

    print(ptrn) # progress
}

上面的 for 循环删除了所有不需要的模式,但仅在执行三 (03) 次之后。

我们如何解决这个问题,以便从第一次执行后删除所有不需要的模式?

我是否应该将上面的 for 循环嵌套在另一个循环中以迭代 client_names[i]? 谢谢

您可以在一个正则表达式模式中折叠 patterns 并使用 str_remove_all 删除它的所有出现。

library(dplyr)
library(stringr)

ptrn <- paste0(patterns, collapse = '|')

df <- df %>% mutate(client_name = str_remove_all(client_name, ptrn))
df

#  client_id client_name
#1         1        name
#2         2        name
#3         3        name
#4         4        name
#5         5        name
#6         6        name
#7         7        name
#8         8        name
#9         9        name

数据

client_id <- 1:9 
client_name <- c("name5", "-name", "name--", "name-µ", "name²", "name31", "7name8", "name514", "²name8")
df <- data.frame(client_id, client_name)

这是一个更直接的方法:

您可以 str_extract 所有需要的字符,而不是列出所有不需要的字符,在您的情况下,这些字符是(罗马)字母字符:

library(stringr)
df %>%
  mutate(client_name = str_extract(client_name,"[A-Za-z]+"))
   client_id client_name
1          1        name
2          2        name
3          3        name
4          4        name
5          5        name
6          6        name
7          7        name
8          8        name
9          9        name
10        10        name