我正在尝试遍历一列,并从行的开头删除属于我预定义的字符串集的所有字符。
可复制示例
df <- data.frame(serial = 1:3, name = c("Javier", "Kenneth", "Kasey"))
serial name
1 1 Javier
2 2 Kenneth
3 3 Kasey
条件向量 仅从名称的开头删除这些字符串!
vec <- c("Ja", "Ka")
预期输出
serial name
1 1 vier
2 2 Kenneth
3 3 sey
答案 0 :(得分:4)
我们可以通过将vec
粘贴到一个向量中并使用sub
删除它们的出现来创建模式。
df$name <- sub(paste0("^", vec, collapse = "|"), "", df$name)
df
# serial name
#1 1 vier
#2 2 Kenneth
#3 3 sey
在stringr
中,我们也可以使用str_remove
stringr::str_remove(df$name, paste0("^", vec, collapse = "|"))
#[1] "vier" "Kenneth" "sey"
答案 1 :(得分:3)
由于在此示例中,我们使用固定长度的vec
字符串,因此使用substr
替换甚至可能更有效。不过,只有在df
和/或vec
较大且以灵活性为代价的情况下,这才会真正得到回报。
df$name <- as.character(df$name)
sel <- substr(df$name, 1, 2) %in% vec
df$name[sel] <- substr(df$name, 3, nchar(df$name))[sel]
# serial name
#1 1 vier
#2 2 Kenneth
#3 3 sey
答案 2 :(得分:2)
我们也可以使用substring
library(stringr)
library(dplyr)
df$name <- substring(df$name, replace_na(str_locate(df$name,
paste(vec, collapse="|"))[,2] + 1, 1))
df$name
#[1] "vier" "Kenneth" "sey"
或与str_replace
str_replace(df$name, paste0("^", vec, collapse="|"), "")
#[1] "vier" "Kenneth" "sey"
或使用gsubfn
library(gsubfn)
gsubfn("^.{2}", setNames(rep(list(""), length(vec)), vec), as.character(df$name))
#[1] "vier" "Kenneth" "sey"