我正在尝试分析一些日常幻想阵容,需要将阵容列分成多列,每个位置一个。
我希望定界符为位置(“ 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 |
答案 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"