替代嵌套If Else语句

时间:2017-07-25 01:47:46

标签: r if-statement nested-if

我正在使用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还是其他一些能让我解决这个问题的函数?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

您可以在regex中使用一组字符作为罢工标识符,方法是在[ABC]这样的方括号中指定它们,它将匹配任何字符AB或{{1 }}。这意味着您不必分别写出每个类别。 E.g:

C

答案 1 :(得分:1)

@thelatemail's回答的基础上,结合@mt1022's评论使用case_whenmutate,这是一个完整的示例,使用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>