【问题标题】:How to complete cases by group [duplicate]如何按组完成案例[重复]
【发布时间】:2021-01-16 19:07:43
【问题描述】:

我想计算每个 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 个句点?如何用最后一个值填充缺失的日期?

【问题讨论】:

    标签: r na feature-engineering


    【解决方案1】:

    您可以使用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 有不同的日期,更安全的方法是转换为日期类,为每个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()
    

    【讨论】:

      猜你喜欢
      • 2021-06-01
      • 1970-01-01
      • 2021-02-06
      • 2023-03-24
      • 2017-10-10
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      • 2016-10-18
      相关资源
      最近更新 更多