如何分组完成案例
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()
我想为每个 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()