用或语句r grep

用户名

我一直在研究ar函数,以按游戏ID(即“ 2016/10/11 / chnmlb-sfnmlb-1”)过滤棒球队击球统计数据的大数据框,以按季节创建过去球队对决的列表。

当我使用团队的某些组合时,输出是正确的,而其他组合则不正确。(输出包含各种ID)

我对grep并不真正熟悉,并认为这是问题所在。我通过搜索堆栈溢出来修补我的grep行和列表输出,并认为直到测试证明否则我就拥有了它。

matchup.func <- function (home, away, df) {

    matchups <- grep(paste('[0-9]{4}/[0-9]{2}/[0-9]{2}/[', home, '|', away, 'mlb]{6}-[', away, '|', home, 'mlb]{6}-[0-9]{1}', sep = ''), df$game.id, value = TRUE)

    df <- df[df$game.id %in% matchups, c(1, 3:ncol(df))]

    out <- list()
    for (n in 1:length(unique(df$season))) {
        for (s in unique(df$season)[n]) {
            out[[s]] <- subset(df, season == s)
        }
    }
    return(out)
}

数据帧样本:

bat.stats[sample(nrow(bat.stats), 3), ]
       date                        game.id team wins losses flag ab r  h d t hr rbi bb po da so lob   avg   obp   slg   ops   roi season
1192 2016-04-11 2016/04/11/texmlb-seamlb-1  sea    2      5 away 38 7 14 3 0 0    7  2 27  8 11  15 0.226 0.303 0.336 0.639 0.286      R
764  2016-03-26 2016/03/26/wasmlb-slnmlb-1  sln    8     12 away 38 7  9 2 1 1    5  2 27  8 11  19 0.289 0.354 0.474 0.828 0.400      S
5705 2016-09-26 2016/09/26/oakmlb-anamlb-1  oak   67     89 home 29 2  6 1 0 1    2  2 27 13  4  12 0.260 0.322 0.404 0.726 0.429      R

错误输出样本:

matchup.func('tex', 'sea', bat.stats)
$S
          date team wins losses flag ab  r  h d t hr rbi bb po da so lob   avg   obp   slg   ops   roi season
21  2016-03-02  atl    1      0 home 32  4  7 0 0  2   3  2 27 19  2  11 0.203 0.222 0.406 0.628 1.000      S
22  2016-03-02  bal    0      1 away 40 11 14 3 2  2  11 10 27 13  4  28 0.316 0.415 0.532 0.947 0.000      S
47  2016-03-03  bal    0      2 home 41 10 17 7 0  2  10  0 27  9  3  13 0.329 0.354 0.519 0.873 0.000      S
48  2016-03-03  tba    1      1 away 33  3  5 0 1  0   3  2 24 10  8  13 0.186 0.213 0.343 0.556 0.500      S
141 2016-03-05  tba    2      2 home 35  6  6 2 0  0   5  3 27 11  5  15 0.199 0.266 0.318 0.584 0.500      S
142 2016-03-05  bal    0      5 away 41 10 17 5 1  0  10  4 27  9 10  13 0.331 0.371 0.497 0.868 0.000      S

样品好:

matchup.func('bos', 'bal', bat.stats)
$S
          date team wins losses flag ab  r  h d t hr rbi bb po da so lob   avg   obp   slg   ops   roi season
143 2016-03-06  bal    0      6 home 34  8 14 4 0  0   8  5 27  5  8  22 0.284 0.330 0.420 0.750 0.000      S
144 2016-03-06  bos    3      2 away 38  7 10 3 0  0   7  7 24  7 13  25 0.209 0.285 0.322 0.607 0.600      S
209 2016-03-08  bos    4      3 home 37  1 12 1 1  0   1  4 27 15  8  26 0.222 0.292 0.320 0.612 0.571      S
210 2016-03-08  bal    0      8 away 36  5 12 5 0  1   4  4 27  9  4  27 0.283 0.345 0.429 0.774 0.000      S

在好的情况下,它会按季节列出对决的列表(即S,R,F,D),在不好的情况下会按季节列出,但似乎只按日期而不是团队给出对决。不知道该怎么想。

马克·彼得森

我认为问题在于内部的正则表达式的[]行为与您预期的不同。特别是,它正在寻找与这些字符的任何匹配项,并且以任何顺序进行匹配。相反,您可以尝试

matchups <- grep(paste0("(", home, "|", away, ")mlb-(", home, "|", away, ")mlb")
                 , df$game.id, value = TRUE)

那应该给你主队或客队,然后是主队或客队。但是,如果没有更多的样本数据,我不确定这是否能抓住边缘情况。

您还应该注意,您不必匹配整个字符串,因此开头的日期查找正则表达式可能是多余的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章