如何在R语言中扩展数据集并按年度实现连续计数?
数据集扩展与年度连续计数实现方案
需求回顾
现有数据集包含15行4列:Firm_ID1(企业ID)、Sector(行业代码)、Year(年份)、Month(月份),覆盖2年的月度行为记录(仅记录有行为的月份)。需要完成以下操作:
- 扩展数据集至全量月度观测(每个企业每年12个月),有行为的记录标记为1,新增无行为记录标记为0
- 生成三个变量:
Treat:原数据存在的观测值为1,新增无行为观测值为缺失值(.)Treat1:将Treat的缺失值替换为0,保留1不变Treat2:标记企业在对应年份是否存在连续至少3次的行为记录
解决方案代码
以下是基于tidyverse工具链的完整实现代码:
library(tidyverse) # 构建全量企业-年度-月度观测网格 full_grid <- dfdata %>% distinct(Firm_ID1, Sector, Year) %>% cross_join(tibble(Month = 1:12)) # 扩展数据集并生成Treat、Treat1变量 extended_df <- full_grid %>% left_join(dfdata %>% mutate(Treat = 1), by = c("Firm_ID1", "Sector", "Year", "Month")) %>% mutate( Treat1 = ifelse(is.na(Treat), 0, Treat) ) # 计算Treat2:判断企业当年是否有连续至少3次行为 final_df <- extended_df %>% group_by(Firm_ID1, Year) %>% mutate( # 标记当前月份是否存在行为 has_action = ifelse(!is.na(Treat), 1, 0), # 统计连续行为的片段信息 consecutive_rle = list(rle(has_action)), # 判断是否存在长度≥3的连续行为片段 Treat2 = ifelse(any(map_dbl(consecutive_rle, ~ max(.x$lengths[.x$values == 1], 0)) >= 3), 1, 0) ) %>% ungroup() %>% select(-has_action, -consecutive_rle) # 移除中间临时变量
代码解释
构建全量观测网格:
- 提取数据中所有唯一的企业-行业-年度组合
- 与1-12月的月度序列做交叉连接,生成每个企业每年12个月的全量空观测
生成Treat与Treat1变量:
- 用左连接将原始数据与全量网格合并,原始存在的记录会带上
Treat=1,新增记录的Treat为缺失值 - 通过
ifelse将缺失值替换为0,生成Treat1
- 用左连接将原始数据与全量网格合并,原始存在的记录会带上
计算Treat2变量:
- 按企业-年度分组,先标记每个月份是否有行为(
has_action) - 用
rle()函数统计连续行为的片段长度,筛选出值为1(有行为)的片段,判断是否存在长度≥3的情况,以此生成Treat2(1=存在连续至少3次行为,0=不存在)
- 按企业-年度分组,先标记每个月份是否有行为(
注意事项
- 如果原始数据中存在同一企业-年度-月份的重复记录,需先通过
distinct()去重再执行后续操作 - 确保
Month变量是数值型(1-12),若为字符型需先转换为数值
内容的提问来源于stack exchange,提问作者Guyle
相关产品推荐
相关产品推荐

