如何将零售门店关闭事件数据转换为含0/1标识的面板数据
解决方案
方法1:tidyverse 实现(代码简洁易读,适合日常分析场景)
核心逻辑是先生成所有门店与观测年份的全组合,再基于关闭年份规则衍生0/1标识:
library(tidyverse) # 定义观测时间范围 year_range <- 2015:2019 want.df <- have.df %>% # 为每个门店匹配所有观测年份,生成面板基础结构 crossing(year = year_range) %>% # 计算关闭标识:年份大于等于关闭年份标记为1,未关闭门店全为0 mutate(closed = case_when( is.na(yearclosed) ~ 0, year >= yearclosed ~ 1, .default = 0 ))
方法2:base R 实现(无需安装第三方包)
# 生成所有门店与年份的全组合 want.df_base <- expand.grid(branch = have.df$branch, year = 2015:2019, stringsAsFactors = FALSE) # 关联原表的关闭年份字段 want.df_base <- merge(want.df_base, have.df, by = "branch", all.x = TRUE) # 计算关闭标识 want.df_base$closed <- ifelse(is.na(want.df_base$yearclosed), 0, as.integer(want.df_base$year >= want.df_base$yearclosed)) # 可选:删除不需要的yearclosed字段 # want.df_base$yearclosed <- NULL
方案说明
两种方法都避免了显式for循环,底层都是向量化运算,数据量较大时运算效率远高于自定义循环。你之前尝试宽转长没有进展是因为原始数据不属于宽表结构,直接生成全量维度组合再计算衍生字段是这类单属性转面板场景的最优思路。
内容的提问来源于stack exchange,提问作者Stephen Clark
相关产品推荐
相关产品推荐

