在给定的周期数之后或之前提取字符串的一部分

时间:2014-10-23 03:47:59

标签: r string

我希望在R中提取一部分字符串。我有以下字符向量:

vars <- c("PANAS.pos.1","PANAS.neg.1",
"PANAS.pos.2","PANAS.neg.2",
"PANAS.pos.3","PANAS.neg.3",
"PANAS.pos.4","PANAS.neg.4",
"IPANAT.pos.1","IPANAT.neg.1",
"IPANAT.pos.2","IPANAT.neg.2",
"IPANAT.pos.3","IPANAT.neg.3",
"IPANAT.pos.4","IPANAT.neg.4")

而且我想把它分成两个字符向量,一个单独使用文本,另一个单独使用数字,如下所示:

v1 <- c(PANAS.pos, PANAS.neg, PANAS.pos, PANAS.neg, etc...)
v2 <- c(1, 1, 2, 2, 3, 3, etc...)

我尝试使用sub()但我觉得这段时间有问题。我也考虑过substr()但是文本部分的长度不一样。

2 个答案:

答案 0 :(得分:6)

v1 <- sub("\\.[0-9]+$", "", vars)
v2 <-  as.numeric(sub(".*\\.", "",vars))

在第一种情况v1中,我们在dot(.)字符串末尾匹配[0-9]+后跟数字$,并将其替换为{{1} } ""参数的第二部分。对于subv2,它会匹配最后一个点(".*)之前的一个或多个元素,并将其替换为\\.

或者@Richard Scriven对""的建议。在这里,它更普遍(我猜)。它匹配v1一个或多个元素,并将其捕获为一个组(.*)后跟一个点( )(最后一个点),后跟一个或多个元素(直到字符串的结尾)它没有用[.]指定。对于论证的第二部分,我们使用$来获取捕获的组。在这种情况下,只有一个组。

\\1

或者您可以将sub("(.*)[.].*", "\\1", vars) strplit regex一起使用。在这里,我们要求按点(lookahead)拆分,后面跟一个数字\\.。输出将是一个列表。

(?=\\d)

答案 1 :(得分:5)

qdap 包具有便利功能beg2char&amp;处理此问题的char2end

library(qdap)
v1 <- beg2char(vars, ".", 2)
v2 <- as.numeric(char2end(vars, ".", 2))

## > beg2char(vars, ".", 2)
##  [1] "PANAS.pos"  "PANAS.neg"  "PANAS.pos"  "PANAS.neg"  "PANAS.pos" 
##  [6] "PANAS.neg"  "PANAS.pos"  "PANAS.neg"  "IPANAT.pos" "IPANAT.neg"
## [11] "IPANAT.pos" "IPANAT.neg" "IPANAT.pos" "IPANAT.neg" "IPANAT.pos"
## [16] "IPANAT.neg"

## > as.numeric(char2end(vars, ".", 2))
##  [1] 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4