首页 文章

替代嵌套If Else语句

提问于
浏览
1

我正在使用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 回答

  • 2

    您可以在正则表达式中使用一组字符作为罢工标识符,方法是在 [ABC] 之类的方括号中指定它们,它将匹配任何字符 ABC . 这意味着您不必单独写出每个类别 . 例如 . :

    grepl("^[CFLMST]{2,}", PITCH_SEQ_TX)
    #[1]  TRUE  TRUE FALSE FALSE FALSE
    grepl("^B{3,}", PITCH_SEQ_TX)
    #[1] FALSE FALSE FALSE  TRUE FALSE
    
  • 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>
    

相关问题