如何在R中拆分字符串和数字?

时间:2016-05-13 15:23:58

标签: r

我有以下形式的字符向量(这只是一个示例):

R1Ng(10)
test(0)
n.Ex1T(34)

从上面可以看出,第一部分总是字母数字和标点符号的某种组合,然后有一个带有数字的括号。我想创建一个数值向量,它将值存储在括号内,每个数字应该有name属性,name属性应该是数字前面的字符串。因此,例如,我想将10034存储在数字向量中,其名称属性应为R1Ngtest,分别为n.Ex1T

我总是可以做这样的事情来获取数字并创建一个数字向量:

counts <- regmatches(data, gregexpr("[[:digit:]]+", data))
as.numeric(unlist(counts))

但是,如何提取第一个字符串部分,并将其存储为该数字数组的name属性?

3 个答案:

答案 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)")