确定一组字符串并将其从列中删除

时间:2019-04-23 01:29:49

标签: r regex

我正在尝试遍历一列,并从行的开头删除属于我预定义的字符串集的所有字符。

可复制示例

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

3 个答案:

答案 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"