Установите первое календарное вхождение даты в виде числа «1», а затем переходите изо дня в день - PullRequest
0 голосов
/ 05 декабря 2018

Мой набор данных выглядит следующим образом:

game_data <- data.frame(player = c(1,1,1,1,2,2,2,2), dateday = c("2015-04-08","2015-05-08","2015-05-10","2015-06-28","2015-09-01","2015-09-02","2015-09-03","2015-10-11"), points = c(20,80,140,230,40,60,98,102))

game_data
  player    dateday points
1      1 2015-04-08     20
2      1 2015-05-08     80
3      1 2015-05-10    140
4      1 2015-06-28    230
5      2 2015-09-01     40
6      2 2015-09-02     60
7      2 2015-09-03     98
8      2 2015-10-11    102

Я хочу иметь набор данных, который имеет одно наблюдение для каждого пользователя для каждого дня данных с наблюдением, начиная с первой записи дня для этого пользователя и вызывая ее«1», а затем считать день ото дня.

Это должно выглядеть так (надеюсь, я считал правильно ...)

game_data_new <- data.frame(player = c(1,1,1,1,2,2,2,2), dateday = c(1,2,4,53,1,2,3,41), points = c(20,80,140,230,40,60,98,102))

game_data_new
  player dateday points
1      1       1     20
2      1       2     80
3      1       4    140
4      1      53    230
5      2       1     40
6      2       2     60
7      2       3     98
8      2      41    102

Ответы [ 2 ]

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

базовое решение:

game_data$dateday <- 1 + as.numeric(ave(game_data$dateday, game_data$player, FUN = function(days)c(0, diff(as.Date(days, format = "%Y-%m-%d")))))
#[1]  1 31  3 50  1  2  2 39

данные: строки AsFactors

game_data <- data.frame(
    player = c(1,1,1,1,2,2,2,2),
    dateday = c("2015-04-08","2015-05-08","2015-05-10","2015-06-28","2015-09-01","2015-09-02","2015-09-03","2015-10-11"),
    points = c(20,80,140,230,40,60,98,102),
    stringsAsFactors = FALSE)
0 голосов
/ 05 декабря 2018

Это довольно просто с пакетом dplyr.Конвертируйте dateday в Date объект, который поддерживает вычитание двух дат, чтобы получить разницу во времени в днях, затем получите разницу в днях от дня 0 для каждого игрока и добавьте 1.

library(dplyr)
game_data_new <- game_data %>% 
  mutate(dateday = as.Date(dateday)) %>% 
  group_by(player) %>% 
  mutate(dateday = 1 + as.numeric(dateday - min(dateday)))
...