我正在使用R中的Retrosheet棒球数据并尝试创建一个单独的列(使用dplyr中的mutate函数),该列提醒我现有列中的单个字符串是否以&#34开头两次罢工"或者"三个球。"例如:
PITCH_SEQ_TX <- c('SSSC', 'FFBB', 'BBSSC', 'BBBSB', 'CBSFFFS')
Retrosheet开发者只列出一个球的角色(&#34; b&#34;),但有几个用于罢工(即&#34; c&#34;,&#34; f&#34;,&#34; l&#34;,&#34; m&#34;,&#34; s&#34;,&#34; t&#34;)。因此,如果我想从上面的行中收集哪些序列以两个打击或三个球开始,我将使用:
PITCH_SEQ_TX_Updated <- mutate(PITCH_SEQ_TX, Cutoff = ifelse(grepl("^BBB", PITCH_SEQ_TX),
"Three Balls", ifelse(grepl("^SS", updated_PITCH_SEQ_TX), "Two Strikes",
ifelse(grepl("^FF", PITCH_SEQ_TX), "Two Strikes", "NA"))))
HOWEVER 有两个不同的两个打击计数组合(即cc,cs,ff等)阻止我在整个数据集中使用嵌套的if else语句(我得到了一个错误:当超过50种不同的组合时,第17行的contextstack溢出警告)。是否有一个替代函数可以让我压缩我现有的代码,无论是使用ifelse还是其他一些能让我解决这个问题的函数?任何帮助将不胜感激。
答案 0 :(得分:2)
您可以在regex中使用一组字符作为罢工标识符,方法是在[ABC]
这样的方括号中指定它们,它将匹配任何字符A
,B
或{{1 }}。这意味着您不必分别写出每个类别。 E.g:
C
答案 1 :(得分:1)
在@thelatemail's回答的基础上,结合@mt1022's评论使用case_when
和mutate
,这是一个完整的示例,使用stringr
中的函数文字工作。
library(dplyr)
library(stringr)
# make vector of pitch sequence data
PITCH_SEQ_TX <- c('SSSC', 'FFBB', 'BBSSC', 'BBBSB', 'CBSFFFS')
# make another variable of the number of pitches in each sequence
# this is just so we have two variables for a df
NUM_PITCHES <- stringr::str_count(PITCH_SEQ_TX)
# make a df
BB <- dplyr::tibble(PITCH_SEQ_TX, NUM_PITCHES)
# create the recoded pitch sequence variable - PITCH_SEQ_TX_UPDATED
BB %>%
dplyr::mutate(PITCH_SEQ_TX_UPDATED =
dplyr::case_when(
stringr::str_detect(string = PITCH_SEQ_TX, pattern = "^[CFLMST]{2,}") ~ "Two strikes",
stringr::str_detect(string = PITCH_SEQ_TX, pattern = "^B{3,}") ~ "Three balls"
)
)
# A tibble: 5 x 3
PITCH_SEQ_TX NUM_PITCHES PITCH_SEQ_TX_UPDATED
<chr> <int> <chr>
1 SSSC 4 Two strikes
2 FFBB 4 Two strikes
3 BBSSC 5 <NA>
4 BBBSB 5 Three balls
5 CBSFFFS 7 <NA>