我有以下形式的字符向量(这只是一个示例):
R1Ng(10)
test(0)
n.Ex1T(34)
从上面可以看出,第一部分总是字母数字和标点符号的某种组合,然后有一个带有数字的括号。我想创建一个数值向量,它将值存储在括号内,每个数字应该有name属性,name属性应该是数字前面的字符串。因此,例如,我想将10
,0
,34
存储在数字向量中,其名称属性应为R1Ng
,test
,分别为n.Ex1T
。
我总是可以做这样的事情来获取数字并创建一个数字向量:
counts <- regmatches(data, gregexpr("[[:digit:]]+", data))
as.numeric(unlist(counts))
但是,如何提取第一个字符串部分,并将其存储为该数字数组的name属性?
答案 0 :(得分:1)
How about this:
x <- c("R1Ng(10)", "test(0)", "n.Ex1T(34)")
data.frame(Name = gsub( "\\(.*", "", x),
Count = as.numeric(gsub(".*?\\((.*?)\\).*", "\\1", x)))
# Name Count
# 1 R1Ng 10
# 2 test 0
# 3 n.Ex1T 34
Or alternatively as a vector
setNames(as.numeric(gsub(".*?\\((.*?)\\).*", "\\1", x)),
gsub( "\\(.*", "", x ))
# R1Ng test n.Ex1T
# 10 0 34
答案 1 :(得分:0)
以下是使用相同表达式并捕获括号的另一种变体:
temp <- c("R1Ng(10)", "test(0)", "n.Ex1T(34)")
data.frame(Name=gsub("^(.*)\\((\\d+)\\)$", "\\1", temp),
count=gsub("^(.*)\\((\\d+)\\)$", "\\2", temp))
答案 2 :(得分:0)
我们可以使用str_extract_all
library(stringr)
lst <- str_extract_all(x, "[^()]+")
或strsplit
base R
lst <- strsplit(x, "[()]")
如果我们需要存储为名为vector
的
sapply(lst, function(x) setNames(as.numeric(x[2]), x[1]))
# R1Ng test n.Ex1T
# 10 0 34
x <- c("R1Ng(10)", "test(0)", "n.Ex1T(34)")