【问题标题】:How do I write a filter that matches SOME of the conditions in R?如何编写一个匹配 R 中某些条件的过滤器?
【发布时间】: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 技能结束的地方。因此,我们将不胜感激任何帮助或在正确方向上的轻微推动。

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      定义函数,其中 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多