遍历模式列表以从 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
我有一个包含 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