我正在尝试对非标准类(特别是map
的{{1}}结果)使用嵌套{ti1}}。我似乎无法在正确的课程中到达lubridate
:
interval()
由reprex package(v0.2.0)于2018-07-27创建。
是否可以通过非标准类使用map,还是仍然不支持这种方法?
编辑(更新):
这产生了我想要的,但是效率很低。即使有解决方法,我也希望学习如何正确执行此操作:
unnest()
答案 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
是一种特殊情况,因为它接受向量start
和end
的向量并产生一个包含多个间隔的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))
#