Средства для оценок предыдущих значений - PullRequest
0 голосов
/ 04 марта 2019

У меня есть личные лучшие времена детей в неделю за удар.Для ребенка А, как я могу рассчитать средства этого ребенка за все предыдущие недели, исключая результаты текущей недели?Например, результаты одного ребенка могут выглядеть следующим образом:

df.trial <- data.frame(Week= c("w10", "w9", "w9", "w5", "w5", "w5", "w6", "w6", "w3"), Stroke= c("Fly","Free","Breast","Back","Free","Breast","Fly","Back","Free"),  Score = c(5.5,4.5,4.6,5.2, 4.3, 5.7, 4.7,5.5,4.8))

Я пытаюсь добавить новый столбец для расчета таких средств:

df.desired <- data.frame(Week= c("w10", "w9", "w9", "w5", "w5", "w5", "w6", "w6", "w3"), Stroke= c("Fly","Free","Breast","Back","Free","Breast","Fly","Back","Free"), Score = c(5.5, 4.5, 4.6, 5.2, 4.3, 5.7, 4.7, 5.5, 4.8), prev.mean = c(4.91, 5.03, 5.03, 4.80, 4.80, 4.80, 5.00, 5.00, NA))

У меня есть данныемного детей, поэтому мне нужно будет группировать по имени каждого студента.Кроме того, если нет предыдущих недель, я бы хотел добавить АН.

Я пробовал несколько разных способов и пытался написать такую ​​функцию, как описанная здесь свертка: R всего за предыдущую неделю

Пока не повезло.Любые предложения, пожалуйста?

1 Ответ

0 голосов
/ 04 марта 2019

РЕДАКТИРОВАТЬ: новый ответ

Я неправильно понял ваш вопрос, я думаю, это то, что вы ищете.Обратите внимание, что я добавил столбец kid_id в ваш data.frame, чтобы показать вам решение, которое применимо для нескольких идентификаторов.

Также обратите внимание, что мне нужно преобразовать недели в числовые значения, чтобы я мог организовать недели, в противном случаене будет правильным.

library(tidyverse)

df.trial <- data.frame(Kid_id = 1, Week= c("w10", "w9", "w9", "w5", "w5", "w5", "w6", "w6", "w3"), Stroke= c("Fly","Free","Breast","Back","Free","Breast","Fly","Back","Free"),  Score = c(5.5,4.5,4.6,5.2, 4.3, 5.7, 4.7,5.5,4.8))

df.trial %>% as_tibble() %>% 
  mutate(Week = as.numeric(gsub("w", "", as.character(Week))), 
         kid_id = 1) %>% 
  group_by(kid_id, Week) %>% 
  arrange(kid_id, Week) %>% 
  summarise(sum_score = sum(Score),
            n_score = n()) %>% 
  mutate(prev.mean = map_dbl(seq_along(sum_score), ~sum(sum_score[1:.x - 1]) / sum(n_score[1:.x - 1])),
         Week = paste0("w", Week)) %>% 
  ungroup() %>% 
  select(kid_id, Week, prev.mean) %>% 
  left_join(df.trial, ., by = "Week")


  Week Stroke Score kid_id prev.mean
1  w10    Fly   5.5      1  4.912500
2   w9   Free   4.5      1  5.033333
3   w9 Breast   4.6      1  5.033333
4   w5   Back   5.2      1  4.800000
5   w5   Free   4.3      1  4.800000
6   w5 Breast   5.7      1  4.800000
7   w6    Fly   4.7      1  5.000000
8   w6   Back   5.5      1  5.000000
9   w3   Free   4.8      1       NaN

Здесь у вас есть NaN вместо NA, но при желании их можно легко заменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...