在 R 中第二次出现模式时剪切字符串向量的每个元素

Cut every element of a vector of strings at the second occurrence of a pattern in R

我有一个 chr 向量:

> head(strings)
[1] "10_88517_0"  "10_88521_1"  "10_88542_2"  "10_280230_3" "10_280258_4" "10_280310_5"

我想创建一个新的子字符串向量,通过在第二个 _ 处切割该向量的每个元素获得。例如:

> head(cut_strings)
[1] "10_88517"  "10_88521"  "10_88542"  "10_280230" "10_280258" "10_280310"

我的想法是首先 grep 查找每个字符串中第二个 _ 的位置:

cut_pts <- sapply(stringr::str_locate_all(strings, "_"), "[", 2)

虽然我能想到的只是一个笨拙的 for 循环,它遍历 strings 向量并为每个元素调用 substr,例如:

cut_strings <- strings
for(i in 1:length(strings)){
  string <- strings[i]
  cut_pt <- cut_pts[i]
  string <- substr(string, 1, cut_pt-1)
  cut_strings[i] <- string
}

我想也许有一种方法可以在这种情况下使用 apply,根据 cut_pts 的适当元素剪切 strings 的每个元素?

我们可以捕获 sub 中的那些字符,然后删除子字符串,即下面的模式匹配一​​个或多个字符,而不是下划线 ([^_]+) 后跟下划线,然后是字符不是下划线,并通过不包括在捕获组 ((...)) 中删除从第二个下划线开始的字符。请注意,我们指定了字符串的开头 (^)。在替换中,使用捕获组

的反向引用(\1
sub("^([^_]+_[^_]+)_.*", "\1", strings)