我正在玩一些从retrosheet.org下载的盒子得分数据。数据没有提供主队和客队的总得分,而是提供以下格式的线得分:"10030(11)02x"
其中每个数字代表一局。 ()中的数字表示在一个局中得分超过9次,而x则表示该队没有击打的半局(主队在第9局底部排名领先)。

我正在尝试找出一种使用函数系统地汇总总运行次数的方法。理想情况下,我可以运行以下内容:

f("10030(11)02x") = 17

我正在使用sum(sapply(strsplit("10001000x", ""), as.numeric), na.rm=T)为不包含两位数的一局的所有观测值计算总和,但是我正在努力弄清楚如何处理两位数的局和括号。

最佳答案

这个怎么样

runcount<-function(x) {
    # find double digits
    m <- gregexpr("\\(\\d+\\)",x)
    dd <- regmatches(x,m)
    # remove double digits
    regmatches(x,m)<-""
    # remove x's
    x <- gsub("x","",x)
    # sum numbers
    # add back in double digit values (remove parens)
    sapply(strsplit(x,""), function(x) sum(as.numeric(x))) +
      sapply(dd, function(x) sum(as.numeric(substr(x,2,nchar(x)-1))))
}

runcount("10030(11)02x")
# [1] 17

runcount("10030(11)(12)2x")
# [1] 29

runcount("100301020")
# [1] 7

runcount(c("10030(11)02x","10030(11)(12)2x","100301020"))
# [1] 17 29  7

09-11 16:14