这是一个解决方案,它将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"