我有按 id 分組的長時間序列資料框。該系列有不同的開始日期,也缺少觀察結果。我想通過填寫日期和 ID 并將其填充為 0 來完成缺失的觀察。
在這個程序中我要避免的是,在一開始就完成缺失的觀察,因為這只是一個指標,時間序列有一個較晚的起點(例如不同的產品發布日期)。
在我的代表中,我使用complete了 from tidyr。它與我想要的相反。它不是用“2015-01-04”完成id“A1”,而是用“2015-01-01”完成id“B1”,在這種情況下不需要。完成是否總是創建相同大小的組?也許那是錯誤的功能。
如何在以下示例中實作相反的效果?
library(tidyr)
data <- data.frame (id = as.character(c(rep("A1",6),rep("B1",5))),
value = c(seq( 1, 9, length.out = 11)),
date = as.Date(c(c("2015-01-01","2015-01-02","2015-01-03",
"2015-01-05","2015-01-06","2015-01-07"),
c("2015-01-02","2015-01-03","2015-01-05",
"2015-01-06","2015-01-07")
)
)
)
data %>% complete(date, id, fill = list(value = 0))
uj5u.com熱心網友回復:
您需要提供明確填寫的日期:
data %>%
group_by(id) %>%
complete(date = seq(min(date), max(date), by = 1), fill = list(value = 0))
uj5u.com熱心網友回復:
做矩形最容易表達。您可以按如下方式重新引入缺失:
data %>%
tidyr::complete(date, id, fill = list(value = 0)) %>%
dplyr::group_by(id) %>%
dplyr::arrange(date) %>% # Ensure it's sorted by date
dplyr::filter(!cumall(value == 0)) %>% # Don't keep zeros that didn't have non-0 rows before
dplyr::ungroup()
uj5u.com熱心網友回復:
library(tidyverse)
data <- data.frame(
id = as.character(c(rep("A1", 6), rep("B1", 5))),
value = c(seq(1, 9, length.out = 11)),
date = as.Date(c(
c(
"2015-01-01", "2015-01-02", "2015-01-03",
"2015-01-05", "2015-01-06", "2015-01-07"
),
c(
"2015-01-02", "2015-01-03", "2015-01-05",
"2015-01-06", "2015-01-07"
)
))
)
all_dates <- seq(min(data$date), max(data$date), by = "day") %>% as.character()
# complete all dates for each id
data %>%
as_tibble() %>%
group_by(id) %>%
mutate(date = date %>% as.character() %>% factor(levels = all_dates)) %>%
complete(date, fill = list(value = 0)) %>%
mutate(date = date %>% as.Date())
#> # A tibble: 14 × 3
#> # Groups: id [2]
#> id date value
#> <chr> <date> <dbl>
#> 1 A1 2015-01-01 1
#> 2 A1 2015-01-02 1.8
#> 3 A1 2015-01-03 2.6
#> 4 A1 2015-01-04 0
#> 5 A1 2015-01-05 3.4
#> 6 A1 2015-01-06 4.2
#> 7 A1 2015-01-07 5
#> 8 B1 2015-01-01 0
#> 9 B1 2015-01-02 5.8
#> 10 B1 2015-01-03 6.6
#> 11 B1 2015-01-04 0
#> 12 B1 2015-01-05 7.4
#> 13 B1 2015-01-06 8.2
#> 14 B1 2015-01-07 9
由reprex 包創建于 2022-04-01 (v2.0.0 )
uj5u.com熱心網友回復:
這不是很優雅,但它有效。
data.frame(date = rep(dates, length(id)),
id = rep(ids, each = length(dates))) |>
full_join(data) |>
arrange(id, date) |>
group_by(id) |>
filter(!is.na(value) | row_number() > 1) |>
mutate(value = replace_na(value, 0)) |>
ungroup()
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/454420.html
上一篇:在r中創建具有第三個屬性的時間線
