如何编写与 R 中的某些条件相匹配的过滤器?
How do I write a filter that matches SOME of the conditions in R?
我有一个篮球框得分数据的数据框。
像这样:
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)
我想做的是检查玩家是否达到了 'triple-double',这意味着在五个统计类别中的至少三个类别中积累了两位数。任意三个。所以我写了下面的函数:
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 更有意义。
另一个有趣的统计壮举称为五乘五,即一名球员在所有五个类别中至少获得五分。
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 技能到此为止。因此,我们将不胜感激在正确方向上提供的任何帮助或轻微推动。
定义函数,其中 r 是类别中的点数,k 是类别数。
library(data.table)
data<-as.data.table(data)
function_sum_k<-function(x,r,k){
ifelse(sum(x>=r)>=k,1,0)
}
data[,needed_outcome:=function_sum_k(x=unlist(.SD),r=10,k=3),.SDcols=c("PTS","REB","AST","STL","BLK"),by=1:nrow(data)]
data
player team opponent date PTS REB AST STL BLK needed_outcome
1: Michael Jordan CHI SAS 1985 30 6 6 5 1 0
2: Scottie Pippen CHI SAS 1985 17 11 10 5 5 1
3: Dennis Rodman CHI SAS 1985 8 14 0 5 4 0
4: Tim Duncan SAS CHI 1985 21 21 3 1 10 1
statcombcheck = function(df, count, categories){
df %>% filter(
rowSums(cbind(PTS, REB, AST, STL, BLK)>=count, na.rm = TRUE)>=categories
) %>%
print()
}
# triple-double
statcombcheck(data, 10, 3)
# player team opponent date PTS REB AST STL BLK
# 1 Scottie Pippen CHI SAS 1985 17 11 10 5 5
# 2 Tim Duncan SAS CHI 1985 21 21 3 1 10
# five-by-five
statcombcheck(data, 5, 5)
# player team opponent date PTS REB AST STL BLK
# 1 Scottie Pippen CHI SAS 1985 17 11 10 5 5
我有一个篮球框得分数据的数据框。
像这样:
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)
我想做的是检查玩家是否达到了 'triple-double',这意味着在五个统计类别中的至少三个类别中积累了两位数。任意三个。所以我写了下面的函数:
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 更有意义。
另一个有趣的统计壮举称为五乘五,即一名球员在所有五个类别中至少获得五分。
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 技能到此为止。因此,我们将不胜感激在正确方向上提供的任何帮助或轻微推动。
定义函数,其中 r 是类别中的点数,k 是类别数。
library(data.table)
data<-as.data.table(data)
function_sum_k<-function(x,r,k){
ifelse(sum(x>=r)>=k,1,0)
}
data[,needed_outcome:=function_sum_k(x=unlist(.SD),r=10,k=3),.SDcols=c("PTS","REB","AST","STL","BLK"),by=1:nrow(data)]
data
player team opponent date PTS REB AST STL BLK needed_outcome
1: Michael Jordan CHI SAS 1985 30 6 6 5 1 0
2: Scottie Pippen CHI SAS 1985 17 11 10 5 5 1
3: Dennis Rodman CHI SAS 1985 8 14 0 5 4 0
4: Tim Duncan SAS CHI 1985 21 21 3 1 10 1
statcombcheck = function(df, count, categories){
df %>% filter(
rowSums(cbind(PTS, REB, AST, STL, BLK)>=count, na.rm = TRUE)>=categories
) %>%
print()
}
# triple-double
statcombcheck(data, 10, 3)
# player team opponent date PTS REB AST STL BLK
# 1 Scottie Pippen CHI SAS 1985 17 11 10 5 5
# 2 Tim Duncan SAS CHI 1985 21 21 3 1 10
# five-by-five
statcombcheck(data, 5, 5)
# player team opponent date PTS REB AST STL BLK
# 1 Scottie Pippen CHI SAS 1985 17 11 10 5 5