Как разделить значение символа, чтобы разделить на регулярное выражение в матрице - PullRequest
3 голосов
/ 23 сентября 2019

Пример данных:

X <- as.matrix(c("2019.01.01 (TUE) A STADIUM       [spectator : 4000]", "2019.01.01 (TUE) C STADIUM       [spectator : 3600]", "2018.01.02 (WED) B STADIUM       [spectator : 2800]", "2019.01.02 (WED) D STADIUM       [spectator : 3500]"))
X
     [,1]                                                  
[1,] 2019.01.01 (TUE) A STADIUM       [spectator : 4000]
[2,] 2019.01.01 (TUE) C STADIUM       [spectator : 3600]
[3,] 2018.01.02 (WED) B STADIUM       [spectator : 2800]
[4,] 2019.01.02 (WED) D STADIUM       [spectator : 3500]

Я хочу разделить этот фрейм данных на 3 или 4 столбца.Как это:

         Day Day2    STADIUM   Spectator                                    
1 2019.01.01 TUE   A STADIUM    4000
2 2019.01.01 TUE   C STADIUM    3600
3 2018.01.02 WED   B STADIUM    2800
4 2019.01.02 WED   D STADIUM    3500

Что я пробовал : str_split возвращает список.Так что я использовал str_split_fixed.Требуется n значение.Я назначил n = 4. Но это отдельный знак препинания вперед.

str_split_fixed(X, n = 4, '[[:punct:]]')
     [,1]   [,2] [,3]  [,4]                                     
[1,] "2019" "01" "01 " "TUE) A STADIUM       [spectator : 4000]"
[2,] "2019" "01" "01 " "TUE) C STADIUM       [spectator : 3600]"
[3,] "2018" "01" "02 " "WED) B STADIUM       [spectator : 2800]"
[4,] "2019" "01" "02 " "WED) D STADIUM       [spectator : 3500]"

Ответы [ 2 ]

3 голосов
/ 23 сентября 2019

Вы можете сделать:

X <- c("2019.01.01 (TUE) A STADIUM       [spectator : 4000]", "2019.01.01 (TUE) C STADIUM       [spectator : 3600]", "2018.01.02 (WED) B STADIUM       [spectator : 2800]", "2019.01.02 (WED) D STADIUM       [spectator : 3500]")
Dat <- read.table(text=X)[c(1:3, 7)]
names(Dat) <- c("Day", "Day2", "STADIUM", "Spectator")
Dat$Spectator <- sub("]", "", Dat$Spectator, fixed = TRUE)
Dat$Day2 <- substr(Dat$Day2, 2, 4)
Dat
# > Dat
#          Day Day2 STADIUM Spectator
# 1 2019.01.01  TUE       A      4000
# 2 2019.01.01  TUE       C      3600
# 3 2018.01.02  WED       B      2800
# 4 2019.01.02  WED       D      3500
3 голосов
/ 23 сентября 2019

Мы можем использовать tidyr::extract, определяя группы захвата для извлечения

tidyr::extract(data.frame(X), X, into = c("Day", "Day2", "Stadium", "Spectator"), 
           regex = "(.*)\\((.*)\\).*([A-Z]+ STADIUM).*spectator : (\\d+)")

#         Day  Day2   Stadium Spectator
#1 2019.01.01   TUE A STADIUM      4000
#2 2019.01.01   TUE C STADIUM      3600
#3 2018.01.02   WED B STADIUM      2800
#4 2019.01.02   WED D STADIUM      3500

Здесь мы определяем 4 группы захвата.

1) Начинается с начала текста до появления открывающей круглой скобки.

2) Текст между открывающими и закрывающими круглыми скобками.

3) Один или несколько символов из [A-Z], за которыми следует слово "STADIUM"

4) число после слова "spectator".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...