Добавление столбца mean () с несколькими фильтрами по всему фрейму данных в R - PullRequest
0 голосов
/ 17 апреля 2020

новичок в R, я использую его для анализа НФЛ в кадре данных, где соответствующие столбцы выглядят так:

  1. Рэнди Мосс 12,9 2000
  2. Рэнди Мосс 21,6 2000
  3. Рэнди Мосс 4.0 2000
  4. Рэнди Мосс 44.7 2000
  5. Рэнди Мосс 25.8 2000
  6. Рэнди Мосс 12.9 2000

это не list, это информационный фрейм, где столбцы фэнтези игрока ("fname.1") для каждой игры ("fp3") и год игры ("year") - это рассматриваемые столбцы. Эти данные включают все годы, начиная с 2000-2019 гг.

Я хочу добавить столбец, который является средним значением всех фантазийных результатов за этот год для этого игрока. Итак, мой требуемый вывод в данных примера (если Рэнди Мосс сыграл только 6 игр) добавит столбец среднего значения для каждой записи, например:

  1. Рэнди Мосс 12.9 2000 16.98333
  2. Рэнди Мосс 21,6 2000 16,98333
  3. Рэнди Мосс 4,0 2000 16,98333
  4. Рэнди Мосс 44,7 2000 16,98333
  5. Рэнди Мосс 25,8 2000 16,98333
  6. Рэнди Мосс 12,9 2000 16.98333

У меня проблемы с использованием простой формулы group_by () и summaze () из-за необходимости разного среднего значения для каждого игрока на каждый год. Я написал для l oop, который создает список с необходимой мне информацией, но я не уверен, как добавить это в исходные данные или есть ли более простой способ выполнить sh это ...

mean_fantasy <- list()
 for(y in 2000:2019) {
     mean_fantasy[[y]] <- offense_test %>%
         filter(year == y) %>%
         group_by(fname.1) %>%
         summarize(mean_fp3 = sum(fp3)/n(), games = n(), year = sum(year)/n())     
      }

Очень плохо знаком с R и этим форумом, так что, надеюсь, этот вопрос / форматирование имеет смысл

Ответы [ 3 ]

0 голосов
/ 17 апреля 2020

Просто использование функции ave() должно дать результат, который вы ищете, давая среднее значение на игрока в год.

   fp3 <- rnorm(20,20,5)
   player <- rep(c(LETTERS)[1:4], each = 5)
   year <- as.factor(rep(seq(2015,2016, by = 1), 10))

   df <- data.frame(player,fp3,year)

   df$mean.player.year <- ave(df$fp3, df[,c('player', 'year')], FUN = mean)

   # And for the desired output view...  
   df <- df[order(df$player,df$year),]

 > df
   player       fp3 year mean.player.year
1       A 20.658824 2015         14.36088
3       A 19.842985 2015         14.36088
5       A  2.580835 2015         14.36088
2       A 12.571649 2016         14.33038
4       A 16.089108 2016         14.33038
7       B 34.268847 2015         27.21018
9       B 20.151507 2015         27.21018
6       B  9.363759 2016         15.10290
8       B 19.686929 2016         15.10290
10      B 16.257998 2016         15.10290
11      C 25.823640 2015         21.57919
13      C 17.753304 2015         21.57919
15      C 21.160641 2015         21.57919
12      C 20.878661 2016         23.27219
14      C 25.665711 2016         23.27219
17      D 22.621288 2015         22.81370
19      D 23.006116 2015         22.81370
16      D 25.508619 2016         19.37231
18      D 13.923885 2016         19.37231
20      D 18.684435 2016         19.37231
0 голосов
/ 17 апреля 2020

Спасибо за ответы, ребята, пошли с Roasty, так как это было проще. Можно проверить, что это сработало

0 голосов
/ 17 апреля 2020

Мы могли бы использовать transmute с map

library(dplyr)
library(purrr)
library(stringr)
out <-  map_dfc(2000:2019, ~ offense_test %>%
                     filter(year == .x) %>%
                     group_by(fname.1) %>%
                     transmute(!! str_c('mean_fp3_', .x) :=  sum(fp3)/n(),
                               !! str_c('games_', .x) := n(), 
                               !! str_c('year_', .x)  := sum(year)/n())) %>%
        bind_cols(offense_test, .)

Если нам нужен один столбец mean, тогда нам не нужен al oop, используйте 'year' также в group_by, а затем создайте столбец с mutate

offense_test %>%
     group_by(fname.1, year) %>%
     mutate(mean_fp3 = mean(fp3), games = n())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...