我希望在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()但是文本部分的长度不一样。
答案 0 :(得分:6)
v1 <- sub("\\.[0-9]+$", "", vars)
v2 <- as.numeric(sub(".*\\.", "",vars))
在第一种情况v1
中,我们在dot(.)
字符串末尾匹配[0-9]+
后跟数字$
,并将其替换为{{1} } ""
参数的第二部分。对于sub
,v2
,它会匹配最后一个点(".*
)之前的一个或多个元素,并将其替换为\\.
。
或者@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