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

如何在R语言中按规则生成分组时间持续变量?

在R语言中按公司分组创建时间持续变量

核心规则

按company分组生成timeduration变量,遵循以下逻辑:

  • value为NA时,timeduration对应NA
  • 0出现在NA之后,计数从1开始
  • 0出现在任意非NA值之后,延续前序计数
  • 遇到非0非NA的value时,重置计数为1

初始数据

company <- rep(c("A", "B"), each=8)
year <- rep(1980:1987, 2)
value <- c(NA,0,0,0,1,0,-1,1,NA,-3,NA,0,0,1,0,0)
data <- data.frame(company, year, value)

解决方案代码

使用dplyr包实现分组计数逻辑:

library(dplyr)

data1 <- data %>%
  group_by(company) %>%
  mutate(
    # 标记每个计数周期的起始点
    start_flag = case_when(
      is.na(value) ~ FALSE,
      row_number() == 1 ~ !is.na(value),
      is.na(lag(value)) ~ TRUE,
      !is.na(lag(value)) & value != 0 ~ TRUE,
      TRUE ~ FALSE
    ),
    # 生成组内的子周期ID
    group_id = cumsum(start_flag),
    # 计算每个子周期内的持续计数
    timeduration = ifelse(is.na(value), NA, row_number() - match(group_id, unique(group_id)) + 1)
  ) %>%
  select(-start_flag, -group_id) %>%
  ungroup()

结果验证

运行代码后得到的data1与期望结果完全匹配:

print(data1)
#   company year value timeduration
#1        A 1980    NA           NA
#2        A 1981     0            1
#3        A 1982     0            2
#4        A 1983     0            3
#5        A 1984     1            1
#6        A 1985     0            2
#7        A 1986    -1            1
#8        A 1987     1            1
#9        B 1980    NA           NA
#10       B 1981    -3            1
#11       B 1982    NA           NA
#12       B 1983     0            1
#13       B 1984     0            2
#14       B 1985     1            1
#15       B 1986     0            2
#16       B 1987     0            3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:26:12