R разбить строку и сохранить раздел - PullRequest
0 голосов
/ 11 марта 2019

У меня есть строка, содержащая начальный состав (извлеченный из Интернета) для игры в регби, она выглядит так:

 "Crusaders: 15 David Havili, 14 Seta Tamanivalu, 13 Jack Goodhue, 12 Ryan Crotty, 11 George Bridge, 10 Richie Mo’unga, 9 Bryn Hall, 8 Kieran Read, 7 Matt Todd, 6 Heiden Bedwell-Curtis, 5 Sam Whitelock (c), 4 Scott Barrett, 3 Owen Franks, 2 Codie Taylor, 1 Joe MoodyReplacements: 16 Sam Anderson-Heather, 17 Tim Perry, 18 Michael Alaalatoa, 19 Luke Romano, 20 Pete Samu, 21 Mitchell Drummond, 22 Mitchell Hunt, 23 Braydon Ennor"

То, что я хочу, это, по сути, таблица с двумя столбцами, один из которых обозначает номер игрока, а другой - имя игрока. например,

position     name
1            Joe Moody
2            Codie Taylor
3            Owen Franks
4            Scott Barrett
...          ...

Для всех игроков.

Я пытался использовать strsplit, разделив на ",", но проблема становится первым игроком:

"Crusaders: 15 David Havili"

и числа 1 и 16 сливаются

"1 Joe MoodyReplacements: 16 Sam Anderson-Heather".

Есть идеи?

Ответы [ 3 ]

1 голос
/ 11 марта 2019

Я согласен с комментарием @ HongOoi;Лучше сделать шаг назад и убедиться, что данные импортируются более разумным способом.Тем не менее, вот специальное хакерское решение.Не уверен, насколько хорошо это обобщает, если вообще.

ss <-  "Crusaders: 15 David Havili, 14 Seta Tamanivalu, 13 Jack Goodhue, 12 Ryan Crotty, 11 George Bridge, 10 Richie Mo’unga, 9 Bryn Hall, 8 Kieran Read, 7 Matt Todd, 6 Heiden Bedwell-Curtis, 5 Sam Whitelock (c), 4 Scott Barrett, 3 Owen Franks, 2 Codie Taylor, 1 Joe MoodyReplacements: 16 Sam Anderson-Heather, 17 Tim Perry, 18 Michael Alaalatoa, 19 Luke Romano, 20 Pete Samu, 21 Mitchell Drummond, 22 Mitchell Hunt, 23 Braydon Ennor"


library(tidyverse)
data.frame(ss = ss) %>%
    mutate(ss = str_replace(ss, "Replacements", "")) %>%   # Remove "Replacements"
    mutate(ss = str_split(ss, "(,|:) ")) %>%               # Split on "," or ":"
    unnest() %>%
    separate(ss, c("position", "name"), sep = "(?<=\\d)\\s", fill = "right") %>%
    filter(!is.na(name))                                   # Remove the first "Crusaders" line
#   position                  name
#1        15          David Havili
#2        14       Seta Tamanivalu
#3        13          Jack Goodhue
#4        12           Ryan Crotty
#5        11         George Bridge
#6        10        Richie Mo’unga
#7         9             Bryn Hall
#8         8           Kieran Read
#9         7             Matt Todd
#10        6 Heiden Bedwell-Curtis
#11        5     Sam Whitelock (c)
#12        4         Scott Barrett
#13        3           Owen Franks
#14        2          Codie Taylor
#15        1             Joe Moody
#16       16  Sam Anderson-Heather
#17       17             Tim Perry
#18       18     Michael Alaalatoa
#19       19           Luke Romano
#20       20             Pete Samu
#21       21     Mitchell Drummond
#22       22         Mitchell Hunt
#23       23         Braydon Ennor
0 голосов
/ 11 марта 2019

Используя stringr :: str_match_all () и некоторые регулярные выражения, вы можете найти и извлечь все совпадения, следя за тем, чтобы использовать не жадный оператор (?) И соответствующий конец строки, где нет запятой:

library(dplyr)
library(stringr)
ea <- "Crusaders: 15 David Havili, 14 Seta Tamanivalu, 13 Jack Goodhue, 12 Ryan Crotty, 11 George Bridge, 10 Richie Mo’unga, 9 Bryn Hall, 8 Kieran Read, 7 Matt Todd, 6 Heiden Bedwell-Curtis, 5 Sam Whitelock (c), 4 Scott Barrett, 3 Owen Franks, 2 Codie Taylor, 1 Joe MoodyReplacements: 16 Sam Anderson-Heather, 17 Tim Perry, 18 Michael Alaalatoa, 19 Luke Romano, 20 Pete Samu, 21 Mitchell Drummond, 22 Mitchell Hunt, 23 Braydon Ennor"
ea <- unlist(strsplit(ea, "Replacements: "))

tibble(jersey = str_match_all(ea, "\\d+") %>% unlist(),
player = str_match_all(ea, "(?<=\\d\\s).*?(?=.$|,)") %>% unlist())

# A tibble: 23 x 2
   jersey player               
   <chr>  <chr>                
 1 15     David Havili         
 2 14     Seta Tamanivalu      
 3 13     Jack Goodhue         
 4 12     Ryan Crotty          
 5 11     George Bridge  
0 голосов
/ 11 марта 2019

Вот быстрый и грязный подход, который работает с вашей строкой образца.Он не будет работать с другими строками, если название команды отсутствует в начале.

player.string <- "Crusaders: 15 David Havili, 14 Seta Tamanivalu, 13 Jack Goodhue, 12 Ryan Crotty, 11 George Bridge, 10 Richie Mo’unga, 9 Bryn Hall, 8 Kieran Read, 7 Matt Todd, 6 Heiden Bedwell-Curtis, 5 Sam Whitelock (c), 4 Scott Barrett, 3 Owen Franks, 2 Codie Taylor, 1 Joe MoodyReplacements: 16 Sam Anderson-Heather, 17 Tim Perry, 18 Michael Alaalatoa, 19 Luke Romano, 20 Pete Samu, 21 Mitchell Drummond, 22 Mitchell Hunt, 23 Braydon Ennor"

df <- read.table(text = gsub("(\\d+)", "\\1\t", gsub("Replacements:|(^[^:]*:)|, ", "\n", player.string)), header = FALSE, sep = "\t", col.names = c("Number", "Name")) 
df[order(df$Number),]

   Number                   Name
15      1              Joe Moody
14      2           Codie Taylor
13      3            Owen Franks
12      4          Scott Barrett
11      5      Sam Whitelock (c)
10      6  Heiden Bedwell-Curtis
9       7              Matt Todd
8       8            Kieran Read
7       9              Bryn Hall
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...