【问题标题】:exploding data from annual to monthly [duplicate]从年度到月度爆炸式数据[重复]
【发布时间】:2020-06-10 06:17:31
【问题描述】:

这是一个关于:

Exploding dates from annual to monthly

我尝试将数据集稍微更改为:

                 date type     bps
1 2012-06-28 16:00:00    A 2.44376
2 2012-06-28 16:00:00    B 1.73054
3 2012-06-28 16:00:00    C 1.68171
4 2013-06-27 16:00:00    A 2.07297
5 2013-06-27 16:00:00    B 1.77073

以下是数据集定义:

df = structure(list(date = structure(c(1340892000, 1340892000, 1340892000, 
                                       1372341600, 1372341600), class = c("POSIXct", "POSIXt"), tzone = ""), type = 
                      c("A", "B", "C", "A", "B"), bps = 
                      c(2.44376, 1.73054, 1.68171, 2.07297, 1.77073)), .Names = c("date", "type", 
                                                                                  "bps"), class = "data.frame", row.names = c(NA, 5L))

问题是以下代码失败:

df_tbl <- as_tibble(df)

df2_tbl <- df_tbl %>% mutate(date = ceiling_date(date, 'month'),
                             date = map2(date, 
                                         lead(date - 1, default = last(date)), 
                                         seq, by = 'month')) %>% 
  unnest() %>% 
  mutate(date = date - days(1))

出现以下错误:

Error: Problem with `mutate()` input `date`.
x wrong sign in 'by' argument
ℹ Input `date` is `map2(date, lead(date - 1, default = last(date)), seq, by = "month")`.
Run `rlang::last_error()` to see where the error occurred.

原始数据似乎已经包含月度数据,而此数据集是年度数据。

【问题讨论】:

    标签: r tidyverse lubridate


    【解决方案1】:

    如果您查看第一 2 行,它们具有相同的 date,因此在相同日期之间创建每月序列是没有意义的。我认为您需要按组应用解决方案,即type

    library(tidyverse)
    library(lubridate)
    
    df_tbl %>% 
      mutate(date = as.Date(ceiling_date(date, 'month'))) %>%
      group_by(type) %>%
      mutate(date = map2(date, lead(date - 1, default = last(date)),
                         seq, by = 'month')) %>% 
      unnest(date) %>% 
      mutate(date = date - days(1))
    
    #   date       type    bps
    #   <date>     <chr> <dbl>
    # 1 2012-06-29 A      2.44
    # 2 2012-07-29 A      2.44
    # 3 2012-08-29 A      2.44
    # 4 2012-09-29 A      2.44
    # 5 2012-10-29 A      2.44
    # 6 2012-11-29 A      2.44
    # 7 2012-12-29 A      2.44
    # 8 2013-01-29 A      2.44
    # 9 2013-03-01 A      2.44
    #10 2013-03-29 A      2.44
    # … with 17 more rows
    

    【讨论】:

      【解决方案2】:

      我认为可以在这里找到解决方案:

      Exploding dates from annual to monthly over multiple groups

      如果你看好这个例子:

      df = structure(list(sec_id = c(1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1572L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L, 1676L), 
                          date = structure(c(6908, 7273, 7638, 8002, 8369, 8734, 9099, 9464, 9829, 10193, 10560, 10925, 11291, 11656, 12020, 12384, 12752, 13117, 13482, 13847, 14211, 14578, 14943, 15308, 15674, 16038, 16402, 16769, 17135, 6784, 7151, 7516, 7881, 8247, 8611, 8975, 9342, 9708, 10073, 10438, 10802, 11200, 11565, 11929, 12293, 12661, 13026, 13391, 13756, 14120, 14487, 14852, 15217, 15583, 15947, 16311, 16678, 17044, 6175, 6542, 6908, 7273, 7638, 8002, 8369, 8734, 9099,  9464, 9829, 10193, 10560, 10925, 11291, 11656, 12020, 12384, 12752, 13117, 13482, 13847, 14211, 14578, 14943, 15308, 15674, 16038, 16402, 16769, 17135, 6420, 6784, 7151, 7516, 7881, 8247, 8611, 8975, 9342, 9708, 10073, 10438, 10802, 11200, 11565, 11929, 12293, 12661, 13026, 13391, 13756, 14120, 14487, 14852, 15217, 15583, 15947, 16311, 16678, 17044), class = "Date"),    
                          value = c(0.291022, 0.197242, -0.470581, -0.406716, -3.294938, 1.22421, 3.140976, 0.250468, 0.091548, -0.100863, 0.058375, 0.24784, 0.178765, 0.099276, 0.25472, -0.033291, 0.124165, 0.050947, 0.243008, 0.1205, -0.239625, -0.231221, 0.365649, 0.163779, 0.024976, 0.08388, 0.154777, 0.016473, -0.272928, 0.237446, 0.391304, 0.064583, 0.286497, -0.571342, 1.05039, -0.001038, -0.018711, -0.162076, -0.599241, -4.071504, -0.37761, 1.694085, 0.045113, -0.064748, 0.098901, 0.823333, 0.793419, 0.759225, 0.329818, 0.199564, -0.616418, 1.164773, 0.877078, -0.325099, -0.294199, 0.272016, -0.706077, -2.57027, 0.129316, 0.131234, 0.143554, 0.131058, 0.099229, 0.057275, -0.121562, 0.051187, 0.15589, 0.188605, 0.186155, 0.154765, 0.153816, 0.166873, 0.181998, 0.183937, 0.211225, 0.186216, 0.177731, 0.161529, 0.187527, 0.199608, 0.136866, 0.10001, 0.13546, 0.148756, 0.143177, 0.144643, 0.153461, 0.140774, 0.099231, 0.117254, 0.141094, 0.166662, 0.154047, 0.172634, 0.062807, 0.145724, 0.13481, 0.11031, 0.087178, 0.033243, -0.122207, -0.22856, 0.171272, 0.187948, 0.186266, 0.154494, 0.238273, 0.352929, 0.494341, 0.50497, 0.459309, 0.178825, 0.270483, 0.43428, 0.254988, 0.149881, 0.187119, 0.048877, -0.111647), 
                          metric = c("EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "EPS_GROWTH", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE", "ROE")), 
                     class = c("tbl_df", "tbl", "data.frame"), 
                     row.names = c(NA, -119L), .Names = c("sec_id", "date", "value", "metric"))
      
      
      df3 <- df %>%
        group_by(sec_id, metric) %>%
        mutate(date = ceiling_date(date, 'month'),
               date = map2(date, lead(date - 1, default = last(date)), seq, by = 'month')) %>%
        unnest() %>%
        mutate(date = date - 1) %>%
        arrange(sec_id, metric, date)
      

      然后你显示 df3 结构,你得到:

      > str(df3)
      tibble [1,386 × 4] (S3: grouped_df/tbl_df/tbl/data.frame)
       $ sec_id: int [1:1386] 1572 1572 1572 1572 1572 1572 1572 1572 1572 1572 ...
       $ date  : Date[1:1386], format: "1988-11-30" "1988-12-31" "1989-01-31" "1989-02-28" ...
       $ value : num [1:1386] 0.291 0.291 0.291 0.291 0.291 ...
       $ metric: chr [1:1386] "EPS_GROWTH" "EPS_GROWTH" "EPS_GROWTH" "EPS_GROWTH" ...
       - attr(*, "groups")= tibble [4 × 3] (S3: tbl_df/tbl/data.frame)
        ..$ sec_id: int [1:4] 1572 1572 1676 1676
        ..$ metric: chr [1:4] "EPS_GROWTH" "ROE" "EPS_GROWTH" "ROE"
        ..$ .rows : list<int> [1:4] 
        .. ..$ : int [1:337] 1 2 3 4 5 6 7 8 9 10 ...
        .. ..$ : int [1:361] 338 339 340 341 342 343 344 345 346 347 ...
        .. ..$ : int [1:338] 699 700 701 702 703 704 705 706 707 708 ...
        .. ..$ : int [1:350] 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 ...
        .. ..@ ptype: int(0) 
        ..- attr(*, ".drop")= logi TRUE
      

      这似乎不是一个简单的小标题,而是一个嵌套的小标题。 只需附加以下内容即可找到解决方案:

      %>% as_tibble()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-07
        • 2022-01-27
        • 1970-01-01
        相关资源
        最近更新 更多