我有一个目标字符串:
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.*?)\|.*"