Вот решение, которое преобразует lineup
в строку в формате файла csv, который затем читается как fread()
:
library(magrittr) # piping used to improve readability
lineup %>%
stringr::str_replace_all("\\s(C|P|OF|SS|1B|2B|3B)\\s", "\\\n\\1;") %>%
data.table::fread(header = FALSE, col.names = c("position", "player"))
position player
1: C James McCann
2: P Robbie Ray
3: P Rafael Montero
4: OF Giancarlo Stanton
5: 3B Derek Dietrich
6: SS Miguel Rojas
7: 1B Tommy Joseph
8: OF Marcell Ozuna
9: 2B C?sar Hern?ndez
10: OF Christian Yelich
«Трюк»должен поставить разрыв строки перед символами позиции и разделителем столбцов после, например, " C "
становится "\nC;"
.
lineup %>%
stringr::str_replace_all("\\s(C|P|OF|SS|1B|2B|3B)\\s", "\\\n\\1;")
возвращает
[1] "\nC;James McCann\nP;Robbie Ray\nP;Rafael Montero\nOF;Giancarlo Stanton\n3B;Derek Dietrich\nSS;Miguel Rojas\n1B;Tommy Joseph\nOF;Marcell Ozuna\n2B;C?sar Hern?ndez\nOF;Christian Yelich"
Этот подход не делает много предположений об именах.Он даже работает с именами, такими как James P. McCann
или Robbie Ray, Jr
.
lineup2 %>%
stringr::str_replace_all("\\s(C|P|OF|SS|1B|2B|3B)\\s", "\\\n\\1;") %>%
data.table::fread(header = FALSE, col.names = c("position", "player"))
position player
1: C James P. McCann
2: P Robbie Ray, Jr
3: P Rafael D Montero
4: OF Giancarlo Stanton
5: 3B Derek Dietrich
6: SS Miguel Rojas
7: 1B Tommy Joseph
8: OF Marcell Ozuna
9: 2B C?sar Hern?ndez
10: OF Christian Yelich
Существует три предварительных условия, которые должны быть выполнены:
- Именная часть не должна содержать инициалы, которые также используются в качестве позицииИндикаторы, например, инициалы
C
и P
, должны заканчиваться точкой, чтобы избежать путаницы. - Разделитель столбцов
;
не должен использоваться в других местах в lineup
. - Строка должна начинаться с начального пробела.
Условие 3 можно изменить с помощью улучшенного регулярного выражения, а условие 2 можно проверить на:
lineup3 %T>%
{stopifnot(!stringr::str_detect(., ";"))} %>%
stringr::str_replace_all("(^\\s?|\\s)(C|P|OF|SS|1B|2B|3B)\\s", "\\\n\\2;") %>%
data.table::fread(header = FALSE, col.names = c("position", "player"))
position player
1: C James P. McCann
2: P Robbie Ray, Jr
3: P Rafael Montero
4: OF Giancarlo Stanton
5: 3B Derek Dietrich
6: SS Miguel Rojas
7: 1B Tommy Joseph
8: OF Marcell Ozuna
9: 2B C?sar Hern?ndez
10: OF Christian Yelich
Данные
# original
lineup = " C James McCann P Robbie Ray P Rafael Montero OF Giancarlo Stanton 3B Derek Dietrich SS Miguel Rojas 1B Tommy Joseph OF Marcell Ozuna 2B C?sar Hern?ndez OF Christian Yelich"
# other use cases
lineup1 = "C James McCann P Robbie Ray P Rafael Montero OF Giancarlo Stanton 3B Derek Dietrich SS Miguel Rojas 1B Tommy Joseph OF Marcell Ozuna 2B C?sar Hern?ndez OF Christian Yelich"
lineup2 = " C James P. McCann P Robbie Ray, Jr P Rafael D Montero OF Giancarlo Stanton 3B Derek Dietrich SS Miguel Rojas 1B Tommy Joseph OF Marcell Ozuna 2B C?sar Hern?ndez OF Christian Yelich"
lineup2a = " C James P. McCann P Robbie Ray P Rafael Montero OF Giancarlo Stanton 3B Derek Dietrich SS Miguel Rojas 1B Tommy Joseph OF Marcell Ozuna 2B C?sar Hern?ndez OF Christian Yelich"
lineup2b = " C James McCann P Robbie Ray, Jr P Rafael Montero OF Giancarlo Stanton 3B Derek Dietrich SS Miguel Rojas 1B Tommy Joseph OF Marcell Ozuna 2B C?sar Hern?ndez OF Christian Yelich"
lineup3 = "C James P. McCann P Robbie Ray, Jr P Rafael Montero OF Giancarlo Stanton 3B Derek Dietrich SS Miguel Rojas 1B Tommy Joseph OF Marcell Ozuna 2B C?sar Hern?ndez OF Christian Yelich"
lineup4 = " C James P. McCann P Robbie Ray; Jr P Rafael Montero OF Giancarlo Stanton 3B Derek Dietrich SS Miguel Rojas 1B Tommy Joseph OF Marcell Ozuna 2B C?sar Hern?ndez OF Christian Yelich"