【问题标题】:How to create and populate dummy rows in tidyverse?如何在 tidyverse 中创建和填充虚拟行?
【发布时间】:2023-01-27 18:40:44
【问题描述】:
我正在处理一些月度数据,我想通过创建和填充一些虚拟行将其转换为每日数据,正如问题所暗示的那样。
例如,假设我有以下数据:
date index
2013-04-30 232
2013-05-31 232
2013-06-30 233
有没有一种“简单”的方法,最好是通过tidyverse,假设我在整个月内保持索引不变,我可以将上述数据转换为每日数据?例如,我想为四月创建另外 29 行,范围从 2013-04-01 到 2013-04-29,该月最后一天的索引为四月的 232。其余月份也应如此(我的数据不仅仅是那三个月)。
任何直观的建议将不胜感激:)
【问题讨论】:
标签:
r
dplyr
tidyverse
data-cleaning
【解决方案1】:
使用 tidyr 中的 complete 和 fill 你可以这样做:
dat <- structure(list(
date = structure(c(15825, 15856, 15886), class = "Date"),
index = c(232L, 232L, 233L)
), class = "data.frame", row.names = c(
NA,
-3L
))
library(tidyr)
dat |>
complete(date = seq(as.Date("2013-04-01"), as.Date("2013-06-30"), "day")) |>
fill(index, .direction = "up")
#> # A tibble: 91 × 2
#> date index
#> <date> <int>
#> 1 2013-04-01 232
#> 2 2013-04-02 232
#> 3 2013-04-03 232
#> 4 2013-04-04 232
#> 5 2013-04-05 232
#> 6 2013-04-06 232
#> 7 2013-04-07 232
#> 8 2013-04-08 232
#> 9 2013-04-09 232
#> 10 2013-04-10 232
#> # … with 81 more rows
【解决方案2】:
你可以在complete中使用full_seq:
library(tidyr)
df |>
complete(date = full_seq(date, 1)) |>
fill(index)