如何分组完成案例

How to complete cases by group

我想为每个 id 计算某些变量的比率

例如,如果我有 3 个周期、2 个 ID 和特定度量,如此 df

df <- data.frame(
          date = c(202001L, 202002L, 202003L, 202001L, 202002L, 202003L),
            id = c("a", "a", "a", "b", "b", "b"),
         value = c(23L, 43L, 123L, 56L, 23L, 13L))

我应该可以做到这一点

df_mod <- df %>% 
    group_by(id) %>% 
    mutate(value_var_1 = (value - dplyr::lag(value, 1))/dplyr::lag(value, 1)) %>% 
    ungroup()

但是,例如,如果 id“a”缺少 date = '202002',则意味着滞后将发生在 202001 和 202003 之间,这将不再是 1 的滞后,如本例所示

df <- data.frame(
  date = c(202001L, 202003L, 202001L, 202002L, 202003L),
  id = c("a", "a", "b", "b", "b"),
  value = c(23L, 123L, 56L, 23L, 13L)
)

df_mod <- df %>% 
  group_by(id) %>% 
  mutate(value_var_1 = (value - dplyr::lag(value, 1))/dplyr::lag(value, 1)) %>% 
  ungroup()

如何确保 ID“a”具有计算所需的 3 个周期?我如何用最后一个值填充缺失的日期?

您可以使用 tidyr::complete 来完成缺失的组合并为每个 id 执行计算:

library(dplyr)

df %>%
  tidyr::complete(id, date = unique(date)) %>%
  group_by(id) %>%
  mutate(value_var_1 = (value - lag(value))/lag(value)) %>% 
  ungroup()

如果每个 id 都有不同的日期,更安全的方法是转换为日期 class,为每个 id.

创建一个每月日期序列
df %>%
  mutate(date = as.Date(paste0(date, 1), '%Y%m%d')) %>%
  arrange(id, date) %>%
  group_by(id) %>%
  tidyr::complete(date = seq(min(date), max(date), by = 'month')) %>%
  mutate(value_var_1 = (value - lag(value))/lag(value)) %>% 
  ungroup()