如何在字符串中选择两个字符?

时间:2017-05-26 09:43:43

标签: r gsub

我知道这可能很容易解决,但是,在网上寻找各种示例,我找不到合适的例子来解决我的问题。

我在列下的data.frame中有以下短语:

ID
p_IIJSJ;o_OODJ;l_jjjjw;g_jjjdI
p_HHDU;o_WWj;l_WWOJ;g_jjjDI

我想选择两个词:一个以p_开头的人和一个以g_开头的人,并消除他们之间的所有其余部分....你对如何制作它有什么建议吗?我尝试使用gsub,但目前没有成功。 非常感谢你提前

3 个答案:

答案 0 :(得分:2)

使用strrsplit

的方法
sapply(strsplit(x, ';'), function(i) paste(grep('p_|g_', i, value = TRUE), collapse = ';'))
#[1] "p_IIJSJ;g_jjjdI"

或者订单总是相同的(如@Jaap提到的)

sapply(strsplit(df$ID,';'), function(x) paste(x[c(1,4)], collapse=';'))

答案 1 :(得分:1)

我建议您使用包stringr,这样可以轻松实现:

library(stringr)

a <- "p_IIJSJ;o_OODJ;l_jjjjw;g_jjjdI"
b <- "p_HHDU;o_WWj;l_WWOJ;g_jjjDI"

str_extract(string = a, pattern = c("p_[a-zA-Z]+", "g_[a-zA-Z]+"))

# [1] "p_IIJSJ" "g_jjjdI"

str_extract(string = b, pattern = c("p_[a-zA-Z]+", "g_[a-zA-Z]+"))

# [1] "p_HHDU"  "g_jjjDI"

答案 2 :(得分:0)

我们可以使用sub

sub(";*(p_\\w+).*;*(g_\\w+).*", "\\1;\\2", df1$ID)
#[1] "p_IIJSJ;g_jjjdI" "p_HHDU;g_jjjDI" 

gsub

gsub("[^pg]_\\w+;", "", df1$ID)
#[1] "p_IIJSJ;g_jjjdI" "p_HHDU;g_jjjDI" 

数据

df1 <- structure(list(ID = c("p_IIJSJ;o_OODJ;l_jjjjw;g_jjjdI", "p_HHDU;o_WWj;l_WWOJ;g_jjjDI"
)), .Names = "ID", class = "data.frame", row.names = c(NA, -2L))