【问题标题】:Split Column by multiple delimiters and order按多个分隔符和顺序拆分列
【发布时间】:2019-03-29 00:00:19
【问题描述】:

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

我希望分隔符是位置(“P”、“C”、“1B”、“2B”、“SS”、“3B”、“OF”)。

我曾尝试使用 str_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   |

【问题讨论】:

  • 这些数据的来源是什么?使用一些正则表达式来帮助将其解析为可用的格式并不是很复杂,但看起来好像它可能是从某个已经结构化的地方拉出来的。如果是这种情况,最好从那里抓住它并保持结构完整。

标签: r strsplit


【解决方案1】:

这是一个选项

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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多