【问题标题】:Set first calendrical ocurrence of a date as numeric "1" and then move on day by day将日期的第一个日历出现设置为数字“1”,然后逐日移动
【发布时间】:2018-12-05 14:44:04
【问题描述】:

我的数据集如下所示:

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

【问题讨论】:

    标签: r date dplyr transform panel


    【解决方案1】:

    使用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)))
    

    【讨论】:

      【解决方案2】:

      基础解决方案:

      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
      

      数据:stringsAsFactors

      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)
      

      【讨论】:

        猜你喜欢
        • 2022-10-12
        • 1970-01-01
        • 1970-01-01
        • 2017-07-06
        • 2015-03-06
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多