2014-10-15 3 views
1

У меня есть data.frame, и я хочу разбить один из его столбцов на два на основе регулярного выражения. Более конкретно, строки имеют суффикс в круглых скобках, которые необходимо извлечь в собственный столбец.Как расколоть условие регулярного выражения на основе данных на основе 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

1) gsubfn :: read.patternread.pattern в пакете gsubfn может сделать это. Спички к скобок частям регулярной 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:

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

дает тот же результат.

3) read.table Это решение не использовать регулярное выражение:

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

дает тот же результат.

+0

+1 понравился read.table метод. – akrun

2

Вы также можете использовать 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 
+1

Установка 'convert' в' TRUE' в 'extract' устраняет необходимость в' mutate', хотя 'VAR2' затем преобразуется в коэффициент. – aosmith

+0

@aosmith Спасибо за новую информацию. – akrun

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 
+0

@akrun - Большое спасибо за редактирование. Я не думал, что regex 'sep' был возможен. –

+0

Нет проблем. Раньше у меня был подобный случай, и Ананда Махто предложила это. – akrun

1

Подход с regmatches и gregexpr:

as.data.frame(do.call(rbind, regmatches(dfInit$VAR, gregexpr("\\w+", dfInit$VAR)))) 
Смежные вопросы