我正在玩一些从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