【发布时间】:2017-07-25 01:47:46
【问题描述】:
我正在使用 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"))))
但是两个打击计数(即 cc、cs、ff 等)的不同组合太多,这使我无法在整个数据集上使用嵌套的 if else 语句(我得到一个错误:超过 50 种不同组合时,第 17 行的上下文堆栈溢出警告)。是否有一个替代函数可以让我压缩我现有的代码,无论是使用 ifelse 还是其他可以让我解决这个问题的函数?任何帮助将不胜感激。
【问题讨论】:
-
?switch可能会有所帮助 -
或
case_when,如果你想使用mutate。
标签: r if-statement nested-if