我有一个data.frame
,我希望根据正则表达式将其中一列拆分为两列。更具体地说,字符串在括号中有一个后缀,需要将其提取到自己的列中。
所以,例如我想从这里开始:
dfInit <- data.frame(VAR = paste0(c(1:10),"(",c("A","B"),")"))
到这里:
dfFinal <- data.frame(VAR1 = c(1:10), VAR2 = c("A","B"))
答案 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)
使用regmatches
和gregexpr
的方法:
as.data.frame(do.call(rbind, regmatches(dfInit$VAR, gregexpr("\\w+", dfInit$VAR))))