在 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)
我有一个 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)