2

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

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

4

3 回答 3

2

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

于 2012-06-21T23:16:40.773 回答
1

我是爱尔兰人,住在威尔士,对棒球一无所知,但是,我想我记得听说最多只能有 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 附加到末尾以使它们都具有相同的长度?也许?我不确定,但我认为至少已经回答了这个问题。

于 2012-06-21T23:30:51.970 回答
1

迟到的答案,但是...

有一个新的 R 包用于从MLB 服务器获取数据,包括得分等。也许值得一瞧!

于 2013-08-10T17:49:16.570 回答