按多个定界符和顺序拆分列

时间:2019-03-29 00:00:20

标签: r strsplit

我正在尝试分析一些日常幻想阵容,需要将阵容列分成多列,每个位置一个。

我希望定界符为位置(“ P”,“ C”,“ 1B”,“ 2B”,“ SS”,“ 3B”,“ OF”)。

我尝试使用str_split和split,但是在如何将它们分成单独的列然后进行排序方面有些困惑。

这是我要拆分的列:

Lineup
1B Justin Bour P José Berríos P Justin Verlander 2B Kiké Hernández OF Cody Bellinger OF Joc Pederson C Austin Barnes SS Corey Seager OF Corey Dickerson 3B Jung Ho Kang
P José Berríos OF Albert Almora Jr. SS Javier Báez 3B Kris Bryant 2B Ben Zobrist 1B Anthony Rizzo OF Cody Bellinger OF Joc Pederson C Austin Barnes P Eric Lauer

我希望这样:

P             | P                 | C               | 1B              | 2B .. and so on...
------------- | ----------------- | --------------- | --------------- |
José Berríos  | Justin Verlander  | Austin Barnes   | Justin Bour     |
José Berríos  | Eric Lauer        | Austin Barnes   | Anthony Rizzo   |

1 个答案:

答案 0 :(得分:2)

这是一个选择

pos <- c("P", "C", "1B", "2B", "3S", "3B", "OF", "SS")
pat <- sprintf("(%s)", paste(pos, collapse = "|"))

library(tidyverse)
unlist(str_split(Lineup, "\n")) %>%
    str_split(sprintf("((?<=(%s\\b))\\s|\\s(?=(%s\\b)))", pat, pat)) %>%
    map(~as_tibble(matrix(.x, ncol = 2, byrow = T)) %>%
        group_by(V1) %>%
        mutate(n = 1:n()) %>%
        unite(col, V1, n, sep = "_") %>%
        spread(col, V2)) %>%
    bind_rows()
## A tibble: 2 x 10
#  `1B_1`   `2B_1`   `3B_1`   C_1     OF_1    OF_2   OF_3   P_1    P_2     SS_1
#  <chr>    <chr>    <chr>    <chr>   <chr>   <chr>  <chr>  <chr>  <chr>   <chr>
#1 Justin … Kiké He… Jung Ho… Austin… Cody B… Joc P… Corey… José … Justin… Corey…
#2 Anthony… Ben Zob… Kris Br… Austin… Albert… Cody … Joc P… José … Eric L… Javie…

说明:我们首先定义所有位置(请注意,您忘记了"SS"作为可能位置的分隔符),然后将它们变成pat中的OR正则表达式。然后,我们可以先在Lineup上分割输入字符串"\n"(针对不同的行),然后再在pat上分割。剩下的就是一些相当基本的tidyverse重塑。请注意,由于相同的位置可能会多次出现,并且位置应该是您设计中的列名,因此我们需要通过添加数字来“唯一化”位置。


样本数据

Lineup <-
"1B Justin Bour P José Berríos P Justin Verlander 2B Kiké Hernández OF Cody Bellinger OF Joc Pederson C Austin Barnes SS Corey Seager OF Corey Dickerson 3B Jung Ho Kang
P José Berríos OF Albert Almora Jr. SS Javier Báez 3B Kris Bryant 2B Ben Zobrist 1B Anthony Rizzo OF Cody Bellinger OF Joc Pederson C Austin Barnes P Eric Lauer"