У меня есть фрейм данных о результатах баскетбольной коробки.

Вот так:

 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()
    }

Не выглядит очень элегантно, но выполняет свою работу. Я добавил аргумент подсчета, поскольку большинство баскетбольных мячей, не относящихся к НБА, короче, чем НБА, а тройные удвоения встречаются крайне редко, поэтому более целесообразно использовать 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 заканчиваются. Таким образом, любая помощь или небольшое движение в правильном направлении будет высоко ценится.

0
user8054146 28 Май 2017 в 22:04

2 ответа

Лучший ответ
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
0
Gregory Demin 28 Май 2017 в 20:55

Определите функцию, где 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
0
Vitalijs 28 Май 2017 в 19:23