在嵌套的lubridate类上使用purrr的映射

时间:2018-07-27 22:49:41

标签: r lubridate purrr

我正在尝试对非标准类(特别是map的{​​{1}}结果)使用嵌套{ti1}}。我似乎无法在正确的课程中到达lubridate

interval()

reprex package(v0.2.0)于2018-07-27创建。

是否可以通过非标准类使用map,还是仍然不支持这种方法?

编辑(更新):

这产生了我想要的,但是效率很低。即使有解决方法,我也希望学习如何正确执行此操作:

unnest()

1 个答案:

答案 0 :(得分:0)

根据发布者的评论,我尝试将其用作使用list-columns的示例,而不是解决特定问题的方法。第一步是形成一个list-column,其中包含tibble分组的id个日期。第二步创建一个包含间隔对象的中间list-column。最后一步使用间隔对象的访问器函数简化原子向量。

   df <- structure(list(date = structure(c(16073, 16073, 16210, 16286, 
                                        16486, 16498, 16518, 16539, 16618, 16426, 16496, 16588, 16602, 
                                        16602, 16629, 16654, 16714, 16769, 16776, 17379), class = "Date"), 
                     id = c(8840, 8840, 8840, 8840, 8840, 8840, 8840, 8840, 8840, 
                            8843, 8843, 8843, 8843, 8843, 8843, 8843, 8843, 8843, 8843, 
                            8843)), class = c("tbl_df", "tbl", "data.frame"), 
                     row.names = c(NA, -20L), .Names = c("date", "id"))
#
#   Example of three steps of list-column pipeline 
#
  df_int <- df %>%
    group_by(id) %>% 
    nest(date, .key="date_data")  %>%                       # step 1: create data list-column 
    mutate( date_range = map(.x=date_data,                  # step 2: create intermediate list-columns
                        ~interval(min(.x$date), max(.x$date))) ) %>%
    mutate(start = map(date_range, int_start),              # step 3: simplify the list-columns back down to atomic vectors
           length = map_dbl(date_range, int_length) ) %>%   
    unnest(start, length)

给出

df_int
# A tibble: 2 x 5
     id date_data         date_range     start                 length
  <dbl> <list>            <list>         <dttm>                 <dbl>
1  8840 <tibble [9 x 1]>  <S4: Interval> 2014-01-03 00:00:00 47088000
2  8843 <tibble [11 x 1]> <S4: Interval> 2014-12-22 00:00:00 82339200

结果是一个单个小标题,按标识符分组,这些标识符包含原始数据,中间对象和简化的常规数据,可用于进一步处理。

有关完整说明,请参见Hadley的“数据科学R”,尤其是第20章中“列表-列”部分。

interval的特殊情况

interval是一种特殊情况,因为它接受向量startend的向量并产生一个包含多个间隔的interval对象 这使我们可以执行以下操作:

#  Use summarize to form the list-column with dates
#     and calculate the start and end dates as vectors for each id
#
  df_int2 <- df %>%
            group_by(id) %>%
            summarize( data = list(tibble(date)),
                       start_date = min(date),
                       end_date = max(date))
#
#   summarize has returned the grouped dates as a list of tibbles 
#           and has removed the grouping on id.  
#   mutate can then use the vectors start_date and end_date 
#     in interval to calcuate an interval object containing the two intervals
#
  df_int2 <- df_int2 %>% mutate(date_range = interval(start_date, end_date))
#