R语言:计算纵向区县数据集中各区县首次停电的间隔年数
计算区县首次停电所需年数
给定纵向数据集,其中blackout字段标记区县当年是否经历过至少一次停电,需要统计每个区县首次停电的年份计数(从观测的第一年开始数),全程未停电的区县记为5。
原始数据集
df <- data.frame(district= rep(c(1000:1003), each=4), year= rep(c(2000:2003), rep=4), blackout= c(0,0,1,1,0,0,0,0,1,1,1,1,0,1,0,1))
目标输出
df.1 <- data.frame(district= c(1000:1003), time= c(3,5,1,2))
解决方案
方法1:使用dplyr包(直观易读)
先加载dplyr,按区县分组后给每个区县的观测年份按顺序编号,再提取首次停电的年份序号;若无停电记录则返回5。
library(dplyr) df.1 <- df %>% group_by(district) %>% # 给每个区县的年份按观测顺序编1-4的序号 mutate(year_count = row_number()) %>% summarize( time = ifelse(any(blackout == 1), min(year_count[blackout == 1]), 5) ) %>% ungroup()
方法2:基础R实现(无需额外包)
利用aggregate函数按区县分组,自定义函数查找首次停电的位置,无记录则返回5。
df.1 <- aggregate(blackout ~ district, data = df, FUN = function(x) { # 找到第一个blackout=1的索引 first_blackout <- which(x == 1)[1] # 无停电则返回5,否则返回索引值 if (is.na(first_blackout)) 5 else first_blackout }) # 重命名列名匹配目标格式 names(df.1)[2] <- "time"
两种方法运行后都会得到符合要求的目标数据集。
内容的提问来源于stack exchange,提问作者YouLocalRUser
相关产品推荐
相关产品推荐

