如何拆分基于R data.frame列的正则表达式条件

时间:2014-10-15 13:25:48

标签: regex r dataframe

我有一个data.frame,我希望根据正则表达式将其中一列拆分为两列。更具体地说,字符串在括号中有一个后缀,需要将其提取到自己的列中。

所以,例如我想从这里开始:

dfInit <- data.frame(VAR = paste0(c(1:10),"(",c("A","B"),")"))

到这里:

dfFinal <- data.frame(VAR1 = c(1:10), VAR2 = c("A","B"))

5 个答案:

答案 0 :(得分:6)

1)gsubfn包中的gsubfn :: read.pattern read.pattern可以做到这一点。与常规rexpression的括号部分的匹配被视为字段:

library(gsubfn)
read.pattern(text = as.character(dfInit$VAR), pattern = "(.*)[(](.*)[)]$")

,并提供:

   V1 V2
1   1  A
2   2  B
3   3  A
4   4  B
5   5  A
6   6  B
7   7  A
8   8  B
9   9  A
10 10  B

2)sub 另一种方法是使用sub

data.frame(V1=sub("\\(.*", "", dfInit$VAR), V2=sub(".*\\((.)\\)$", "\\1", dfInit$VAR))

给出相同的结果。

3)read.table 此解决方案不使用正则表达式:

read.table(text = as.character(dfInit$VAR), sep = "(", comment = ")")

给出相同的结果。

答案 1 :(得分:3)

您还可以使用extract

中的tidyr
library(tidyr)
extract(dfInit, VAR, c("VAR1", "VAR2"), "(\\d+).([[:alpha:]]+).", convert=TRUE) # edited and added `convert=TRUE` as per @aosmith's comments.



#    VAR1 VAR2
#1     1    A
#2     2    B
#3     3    A
#4     4    B
#5     5    A
#6     6    B
#7     7    A
#8     8    B
#9     9    A
#10   10    B

答案 2 :(得分:1)

请参阅Split column at delimiter in data frame

dfFinal <- within(dfInit, VAR<-data.frame(do.call('rbind', strsplit(as.character(VAR), '[[:punct:]]'))))

> dfFinal
   VAR.X1 VAR.X2
1       1      A
2       2      B
3       3      A
4       4      B
5       5      A
6       6      B
7       7      A
8       8      B
9       9      A
10     10      B

答案 3 :(得分:1)

您还可以使用cSplit中的splitstackshape

library(splitstackshape)
cSplit(dfInit, "VAR", "[()]", fixed=FALSE)
#    VAR_1 VAR_2
# 1:     1     A
# 2:     2     B
# 3:     3     A
# 4:     4     B
# 5:     5     A
# 6:     6     B
# 7:     7     A
# 8:     8     B
# 9:     9     A
#10:    10     B

答案 4 :(得分:1)

使用regmatchesgregexpr的方法:

as.data.frame(do.call(rbind, regmatches(dfInit$VAR, gregexpr("\\w+", dfInit$VAR))))