我正在使用R中的Retrosheet棒球数据,我正在尝试创建一个单独的列(使用dplyr中的mutate函数),它提醒我现有列中的单个字符串是否以“两次打击”或“三个球”开头“ . 例如:
PITCH_SEQ_TX <- c('SSSC', 'FFBB', 'BBSSC', 'BBBSB', 'CBSFFFS')
Retrosheet开发者只列出一个球的字符(“b”),但有几个用于打击(即“c”,“f”,“l”,“m”,“s”,“t”) . 因此,如果我想从上面的行中收集哪些序列以两个打击或三个球开始,我将使用:
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语句(我得到一个错误:第17行的contextstack溢出警告过去50种不同的组合) . 是否有一个替代函数可以让我压缩我现有的代码,无论是使用ifelse还是其他一些能让我解决这个问题的函数?任何帮助,将不胜感激 .
2 回答
您可以在正则表达式中使用一组字符作为罢工标识符,方法是在
[ABC]
之类的方括号中指定它们,它将匹配任何字符A
,B
或C
. 这意味着您不必单独写出每个类别 . 例如 . :在@thelatemail's回答的基础上,结合@mt1022's注释使用
case_when
和mutate
,这是一个完整的例子,使用stringr
中的函数进行文本工作 .