【问题标题】:How to parse a baseball box score in R如何在R中解析棒球盒得分
【发布时间】:2012-06-21 19:04:42
【问题描述】:

我正在使用来自 retrosheet.org 的棒球数据进行一个研究项目。我想为每局中每支球队的得分创建变量(Vis1、Home1、Vis2、Home2 等)。问题是盒子得分的变量编码很奇怪。每支球队在整场比赛中都有自己的变量,每一局都有一个值。因为前导零被切断,所以“12(10)1X”的值意味着一支球队在前 4 局没有得分,在第五局得分一次,在第六局得分两次,在第七局得分 10 次,在第二局得分一次。第八名,他们不必打第九名,因为那时他们已经赢了。

有什么建议吗?我不知所措。 () 最让我困惑。

【问题讨论】:

  • 你能发布一个更直接的链接到有问题的数据集吗?
  • 我将这个页面上的所有常规赛数据合并到一个数据集中:retrosheet.org/gamelogs/index.html
  • 谢谢。所以 - 如果前导零被截断,您在导入数据时会出现问题。我使用 read.csv 函数将 1995 拉到 R 中,所有的盒子分数都包括前导零。这从根本上简化了您的请求!现在“(10)”位是最困难的,而不是试图弄清楚哪个角色代表哪个局......

标签: string r


【解决方案1】:

在 userR 的这个演讲中有一个例子! 2012 可能会提供更多特定于您的棒球项目的信息。 你可以找到它here.

【讨论】:

    【解决方案2】:

    我是爱尔兰人,住在威尔士,对棒球一无所知,但是,我想我记得听说最多只能有 9 局???? (老实说……没有头绪!!!)

    bbscore = function(x)
    {
     scores = c()
     score = unlist(strsplit(x,split=""))
     i= 1
     while(i<length(score)+1)
     {
       if(score[i]=="(")
       {
         scores = c(scores,paste(score[i+1],score[i+2],sep=""))
         i = i+4
       }
       scores = c(scores,score[i])
       i = i+1
     }
     return(scores)
    }
    > x
    [1] "12(10)1X"
    > bbscore(x)
    [1] "0"  "0"  "0"  "0"  "1"  "2"  "10" "1"  "X" 
    
    > scores.df = read.csv("GL1995.TXT",header=F)
    > head(scores.df$V20)
    [1] 200030300 000000000 000300020 000000010 100100010 001002300
    1355 Levels: (11)00033102 00000000 000000000 0000000000 ... 710001001
    > scores.df$V20 = as.character(scores.df$V20)
    > V20.1995.scores = lapply(scores.df$V21, bbscore)
    > V20.1995.scores = lapply(scores.df$V20, bbscore)
    > V20.1995.scores[[1]]
    [1] "2" "0" "0" "0" "3" "0" "3" "0" "0"
    > V20.1995.scores[[2]]
    [1] "0" "0" "0" "0" "0" "0" "0" "0" "0"
    > V20.1995.scores[[3]]
    [1] "0" "0" "0" "3" "0" "0" "0" "2" "0"
    

    当然,你必须做一些进一步的操作才能将它们变成数字并处理 X,如果还有任何其他意想不到的角色,这也会破坏,除了要感谢 9 局的假设。

    编辑: 我删除了 9 局的规定,并展示了如何对整个专栏执行此操作(假设您所说的分数确实是 csv 文件中的第 20 个变量)。不同的局数需要额外的处理。 do.call(rbind,...) 不起作用。找到最长的游戏并将"X"'s 附加到末尾以使它们都具有相同的长度?也许?我不确定,但我认为这个问题至少已经回答了。

    【讨论】:

    • 另外,一个真正聪明的人可能会使用正则表达式。虽然不是我! :(
    • 不幸的是,如果比分在 9 结束时打成平手,棒球比赛可能会进入加时赛。幸运的是,如果您在问题上查看 OP 在 cmets 中的数据,看起来前导零是实际上完好无损。你介意再对实际数据进行一次传递吗?我认为你在正确的轨道上......
    • 我刚查了一下,17 局是所有比赛中最多的。 &gt; max(sapply(scores.df$V20, nchar)) [1] 17
    • @DavyKavanagh - 实际上,我记得有一场职业棒球比赛的时间要长得多,准确地说是 33 局。事实上,就在我的镇上。 en.wikipedia.org/wiki/Longest_professional_baseball_game
    【解决方案3】:

    迟到的答案,但是...

    有一个新的 R 包用于从 MLB server 获取数据,包括盒子得分等等。可能值得一看!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 2020-04-26
      相关资源
      最近更新 更多