r-从目标字符串的开头提取一个字符串到一个字符



我有一个目标字符串:

Target_string <- "aaa"

我想把它和所有其他字符返回到下一个"|"在字符串的矢量中。

例如,如果我有以下字符串向量:

String <- c("bb|aaa_123|ccc","aaa234|bbb|NA|NA","bbb|ccc|aaab452|ddd|NA|NA")

我的目标输出是:

Target_output <- c("aaa_123","aaa234","aaab452")

我尝试过gsub和str_extract,但我在语法上很吃力,已经没有什么想法了。如有任何帮助,我们将不胜感激。

谢谢,Phil

我建议使用lapply()strsplit(),然后连接结果。您必须创建一个列表来保存匹配结果。此外,可以在lapply()中定义的函数内使用grepl()来进行匹配检查。最后,您可以使用c()函数在L列表上创建一个向量来收集do.call()的所有结果:

#Data
Target_string <- "aaa"
String <- c("bb|aaa_123|ccc","aaa234|bbb|NA|NA","bbb|ccc|aaab452|ddd|NA|NA")
#Split and check
L <- lapply(strsplit(String,split='|', fixed=TRUE),function(x) x[grepl(pattern = Target_string,x = x)])
#Bind
do.call(c,L)

输出:

[1] "aaa_123" "aaa234"  "aaab452"

使用str_extract:

stringr::str_extract(String, paste0(Target_string, '.*?(?=\|)'))
#[1] "aaa_123" "aaa234"  "aaab452"

其中要提取的模式为:

paste0(Target_string, '.*?(?=\|)')
#[1] "aaa.*?(?=\|)"

在基本R中,您可以执行以下操作:

sub(paste0('.*(', Target_string, '.*?)\|.*'), '\1', String)

这里的模式是:

paste0('.*(', Target_string, '.*?)\|.*')
#[1] ".*(aaa.*?)\|.*"

相关内容

最新更新