You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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. 构建全量观测网格:

    • 提取数据中所有唯一的企业-行业-年度组合
    • 与1-12月的月度序列做交叉连接,生成每个企业每年12个月的全量空观测
  2. 生成Treat与Treat1变量:

    • 用左连接将原始数据与全量网格合并,原始存在的记录会带上Treat=1,新增记录的Treat为缺失值
    • 通过ifelse将缺失值替换为0,生成Treat1
  3. 计算Treat2变量:

    • 按企业-年度分组,先标记每个月份是否有行为(has_action)
    • 用rle()函数统计连续行为的片段长度,筛选出值为1(有行为)的片段,判断是否存在长度≥3的情况,以此生成Treat2(1=存在连续至少3次行为,0=不存在)

注意事项

  • 如果原始数据中存在同一企业-年度-月份的重复记录,需先通过distinct()去重再执行后续操作
  • 确保Month变量是数值型(1-12),若为字符型需先转换为数值

内容的提问来源于stack exchange,提问作者Guyle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 14:35:34