如何在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
相关产品推荐
相关产品推荐

