Функция R с двумя циклами - данные бейсбола - PullRequest
0 голосов
/ 20 декабря 2018

Для тех, кто занимается спортом, я работаю над функцией, которая добавляет столбец с количеством питчей для игры в данном сезоне для кувшина.

Например, для данных используются фрейм данных, называемыйпитчер, который содержит game_date и sv_id (дата / отметка времени или шаг).Моя цель - упорядочить sv_id в порядке возрастания для каждой уникальной даты game_date, а затем добавить столбец с системой нумерации для этого порядка.Так, например, если бы для game_date = 9/9/2018 было выброшено 3 шага с sv_id, равным 090918_031456, 090918_031613 и 090918_031534, я бы сначала хотел отсортировать эти данные в хронологическом порядке (090918_031456,090918_031534139018 и затем иметь 003153413901818, затемновый столбец со значениями 1,2,3 соответственно, чтобы действовать как количество шагов.Ниже моя функция до сих пор.Сначала я думал, что составлю список, но теперь я не уверен, что это правильный путь.Пожалуйста помоги!Это также моя первая публикация здесь, поэтому любые советы приветствуются.Спасибо !!!

 `     pitchCount <- function(game_date, sv_id){
       gameUnique<-unique(pitcher$game_date)
       PC<-list()
       for (j in 1:length(gameUnique)){
         PCLocal<-filter(pitcher,game_date==gameUnique[j])
         PCLocal[order(PCLocal$sv_id),]
         for (i in 1:length(PCLocal$sv_id)){
         PCLocal$PC[i]=i
        }
       PC[j]=PCLocal$PC
       }
      return(PC)
      }

      pitch.Count <- pitchCount(pitcher$game_date,pitcher$sv_id)
      pitcher$PC<-pitch.Count
 ` 

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Попробуйте использовать data.table.

library(data.table)

pitcher_dt <- data.table(pitcher)

> pitcher_dt
    game_date         sv_id
1: 2018-01-02 090918_031456
2: 2018-01-02 090918_031613
3: 2018-01-02 090918_031534

Мы можем добавить столбец Count с помощью: = и добавить позицию 'sv_id' по порядку (sv_id).

pitcher_dt [, Count := order(sv_id)]

> pitcher_dt
    game_date         sv_id Count
1: 2018-01-02 090918_031456     1
2: 2018-01-02 090918_031613     3
3: 2018-01-02 090918_031534     2

Так какCount только ставит позицию 'sv_id', в этом случае (1,3,2), мы можем сортировать 'Count' или 'sv_id' в порядке возрастания

pitcher_dt[,order(Count)] or pitcher_dt[,order(sv_id)]

> pitcher_dt[order(Count)]
    game_date         sv_id Count
1: 2018-01-02 090918_031456  1
2: 2018-01-02 090918_031534  2
3: 2018-01-02 090918_031613  3

Для меня это легкоманипулировать данными с data.table.Но вы также можете использовать dplyr. Введение в data.table - хорошее начало для изучения data.table.

0 голосов
/ 20 декабря 2018

Я не уверен, как выглядят ваши данные, но я предполагаю следующее из вашего описания

> df
# A tibble: 9 x 2
  game_date  sv_id        
  <date>     <chr>        
1 2018-09-09 090918_031456
2 2018-09-09 090918_031613
3 2018-09-09 090918_031534
4 2018-05-17 090918_031156
5 2018-05-17 090918_031213
6 2018-06-30 090918_031177
7 2018-06-30 090918_031211
8 2018-06-30 090918_031144
9 2018-06-30 090918_031203

Затем вы используете dplyr для генерации вашей цели

library(dplyr)
df <- df %>% 
    group_by(game_date) %>% 
    mutate(count = n_distinct(sv_id)) %>% #count sv_id with each game_date
    arrange(desc(sv_id))

Вывод:

# A tibble: 9 x 3
# Groups:   game_date [3]
  game_date  sv_id         count
  <date>     <chr>         <int>
1 2018-06-30 090918_031144     4
2 2018-05-17 090918_031156     2
3 2018-06-30 090918_031177     4
4 2018-06-30 090918_031203     4
5 2018-06-30 090918_031211     4
6 2018-05-17 090918_031213     2
7 2018-09-09 090918_031456     3
8 2018-09-09 090918_031534     3
9 2018-09-09 090918_031613     3

Я надеюсь, что это может помочь

0 голосов
/ 20 декабря 2018

То есть, вы хотите считать высотные поля по порядку, верно?Не должно быть необходимости в петле.В R петли нужны редко.

Проверьте, хотите ли вы этого.A tidyverse / dplyr решение.

Переменная sv_id имеет формат, который можно преобразовать в POSIX (тип формата даты).Это упрощает сортировку по порядку.

library(tidyverse)

# Create data_frame
pitcher <- data_frame(game_date = as.Date(c("2018-09-09", "2018-09-09", "2018-09-09")),
           sv_id = c("090918_031456", "090918_031613", "090918_031534"))

# First, convert sv_id strings to POSIX format (this can be done in the code below but this makes it clearer.
pitcher$sv_id <- as.POSIXct(c("090918_031456", "090918_031613", "090918_031534"), format = "%y%m%d_%H%M%S", tz = "GMT")

# Create pitch count
pitcher %>% 
  arrange(sv_id) %>% 
  mutate(Count = 1, pitchcount = cumsum(Count), Count = NULL)

# A tibble: 3 x 3
  game_date  sv_id               pitchcount
  <date>     <dttm>                   <dbl>
1 2018-09-09 2009-09-18 03:14:56          1
2 2018-09-09 2009-09-18 03:15:34          2
3 2018-09-09 2009-09-18 03:16:13          3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...