【发布时间】:2017-05-28 19:04:26
【问题描述】:
我有一个篮球框得分数据的数据框。
像这样:
player <- c("Michael Jordan", "Scottie Pippen", "Dennis Rodman", "Tim Duncan")
team <- c("CHI","CHI","CHI","SAS")
opponent <- c("SAS","SAS","SAS","CHI")
date <- c('1999-11-03', '1999-11-03', '1999-11-03', '1999-11-03')
PTS <- c(30, 17, 8, 21)
REB <- c(6, 11, 14, 21)
AST <- c(6, 10, 0, 3)
STL <- c(5, 5, 5, 1)
BLK <- c(1, 5, 4, 10)
data <- data.frame(player, team, opponent, date, PTS, REB, AST, STL, BLK)
我想做的是检查一名球员是否获得了“三双”,这意味着在五个统计类别中的至少三个中积累了两位数。任意三个。于是我写了如下函数:
library(dplyr)
tripdubcheck <- function(df, count = 10){
df %>% filter((PTS >= count & AST >= count & REB >= count)|
(PTS >= count & AST >= count & BLK >= count)|
(PTS >= count & AST >= count & STL >= count)|
(PTS >= count & BLK >= count & REB >= count)|
(PTS >= count & STL >= count & REB >= count)|
(PTS >= count & STL >= count & BLK >= count)|
(BLK >= count & AST >= count & REB >= count)|
(STL >= count & AST >= count & REB >= count)|
(STL >= count & BLK >= count & REB >= count)|
(STL >= count & AST >= count & BLK >= count)) %>%
print()
}
看起来不是很优雅,但可以完成工作。我添加了 count 参数,因为大多数非 NBA 篮球都比 NBA 短,而且三双极为罕见,因此使用 7 或 8 而不是 10 更有意义。
另一个有趣的统计壮举称为 5×5,即玩家在所有五个类别中至少获得 5 分。
fivebyfivecheck <- function(df, count = 5){
df %>% filter(PTS >= count & AST >= count & REB >= count & STL >= count & BLK >= count) %>%
print()
}
现在,明显的限制是我必须在任何时候创建一个新函数来检查任何其他组合。因此,与其写出 2 的所有组合和 4 的所有组合,不如用一个函数来完成这一切。
statcombcheck <- function(df, count = 10, categories = 3){
???????
}
默认有一个三倍,我可以更改参数以获得我需要的任何计数和组合数量。我的想法是让函数计算有多少类别满足每行的计数,如果它 >= 而不是类别参数,则打印这些行。
然而,这就是我有限的 R 技能结束的地方。因此,我们将不胜感激任何帮助或在正确方向上的轻微推动。
【问题讨论】: