Использование функции фильтра в R. Необходимо назначить NA и сохранить длину набора данных такой же для базы данных о скачках - PullRequest
3 голосов
/ 17 июня 2020

Я все еще новичок в группе и R. У меня есть действительно полезные отзывы по моему последнему запросу, поэтому я надеюсь, что смогу получить дополнительную поддержку со следующим:

Я работаю над базой данных о скачках который на данном этапе имеет 4 переменные: номер скаковой лошади, идентификатор скачек, дистанцию ​​скачек и рейтинг (DaH), присвоенный характеристикам лошадей в гонке.

Набор данных:

horse_ratings <- tibble(
  horse=c(1,1,1,2,2,2,3,3,3),
  raceid=c(1,2,3,1,2,3,1,2,3),
  Dist=c(9.47,9.47,10,10.1,10.2,9,11,9.47,10.5),
  DaH=c(101,99,103,101,94,87,102,96,62)
)

Предоставление:

> horse_ratings
# A tibble: 9 x 4
  horse raceid  Dist   DaH
  <dbl>  <dbl> <dbl> <dbl>
1     1      1  9.47   101
2     1      2  9.47    99
3     1      3 10      103
4     2      1 10.1    101
5     2      2 10.2     94
6     2      3  9       87
7     3      1 11      102
8     3      2  9.47    96
9     3      3 10.5     62

Я выполню ряд вычислений с набором данных, таких как средний рейтинг, максимальный рейтинг и т. Д., Которые id хотели бы привести к количеству векторов одинаковой длины.

Я использую функцию фильтра, чтобы посмотреть рейтинги производительности, достигнутые на разных дистанциях гонок (ie. Начальное расстояние больше 10). Однако, если одна из лошадей не участвовала в забеге на эту дистанцию, я заметил, что результат не включает эту лошадь в выходные данные. ie:

> horse_ratings %>% 
+   group_by(horse) %>% 
+   filter(Dist>10) %>%
+   summarise(mean_rating=mean(DaH))
`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 2 x 2
  horse mean_rating
  <dbl>       <dbl>
1     2        97.5
2     3        82

Итак, лошадь 1 исчезла, поскольку она не участвовала в забеге на дистанцию ​​более 10. Мне нужно сохранить выходной вектор длины 3 в идеале, чтобы я мог поместить все вычисления в в фрейм данных той же длины (для моего окончательного вывода / распечатки данных). Я надеюсь, что есть способ назначить NA или аналогичный результат для лошади 1 Giving:

# A tibble: 2 x 2
  horse mean_rating
  <dbl>       <dbl>
1     1        NA
2     2        97.5
3     3        82

Или аналогичное решение. Помощь будет очень признательна !!

Ответы [ 3 ]

5 голосов
/ 18 июня 2020

Вы можете использовать параметр .drop = FALSE в group_by():

horse_ratings %>%
 group_by(horse, .drop = FALSE) %>% 
 filter(Dist > 10) %>%
 summarise(mean_rating = mean(DaH))

  horse mean_rating
  <dbl>       <dbl>
1     1       NaN  
2     2        97.5
3     3        82  
1 голос
/ 18 июня 2020

Не filter сначала, сделайте это в summarise, чтобы не отбрасывать группы (horse).

library(dplyr)

horse_ratings %>% 
     group_by(horse) %>% 
     summarise(mean_rating = mean(DaH[Dist>10], na.rm = TRUE))

# A tibble: 3 x 2
#  horse mean_rating
#  <dbl>       <dbl>
#1     1       NaN  
#2     2        97.5
#3     3        82  
0 голосов
/ 18 июня 2020
library(tidyverse)

Метод 1:

horse_stats <- 
  horse_ratings %>% 
  mutate(raceid = as.factor(raceid)) %>% 
  filter(Dist > 10) %>% 
  group_by(horse) %>% 
  summarise_if(is.numeric, c("sum", "mean", "max", "min")) %>% 
  ungroup() %>% 
  left_join(horse_ratings %>% 
              select(horse) %>% 
              distinct(), 
            ., by = "horse", all.x = TRUE)

Метод 2:

horse_stats <- 
  horse_ratings %>% 
  mutate(raceid = factor(raceid),
         Dist = ifelse(Dist <= 10, 0, Dist), 
         DaH = ifelse(Dist == 0, 0, Dist)) %>% 
  group_by(horse) %>% 
  summarise_if(is.numeric, c("sum", "mean", "max", "min")) %>% 
  ungroup() %>% 
  mutate_if(is.numeric, list(~na_if(., 0)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...