如何在R中整理数据结构以开展PWP复发事件分析?
R转换数据为PWP复发事件分析格式方法
实现核心逻辑:将每个国家内连续**状态(status)**相同的年份合并为一个计数过程区间,同时对区间内的treatment值求和,完全匹配PWP复发事件模型要求的(time1, time2)计数过程数据结构。
实现步骤
- 数据预处理:修正原数据中字符串类型的
"NA"为R可识别的缺失值,转换相关字段为数值类型方便计算 - 识别连续状态段:按国家分组后,标记状态变化的节点,给连续相同状态的时间段分配唯一分组ID
- 聚合生成目标格式:按国家、状态、连续段ID分组聚合,生成区间起止时间、求和treatment值
完整可运行代码
# 加载所需包 library(tidyverse) # 原始数据 Df <- data.frame(country = c("A", "A", "A", "A", "A", "B","B", "B", "B"), year = c("1950", "1951", "1952", "1953", "1954", "1950", "1951", "1952", "1953"), start_year = c("NA", "1951", "1951", "NA", "1954", "1950", "NA", "1951", "1951"), end_year= c("NA", "NA", "1952", "NA", "1954", "1950", "NA", "NA", "NA"), status = c(0, 1, 1, 0, 1, 1, 0, 1, 1), treatment = c(10, "NA", 20, 5, "NA", "NA", 30, 100, 10)) # 转换逻辑 Df_result <- Df %>% # 替换字符串NA为真实缺失,转换数值类型 mutate(across(c(year, start_year, end_year, treatment), ~ifelse(.x == "NA", NA, as.numeric(.x)))) %>% group_by(country) %>% # 标记状态变化点,生成连续段ID mutate(spell_id = cumsum(status != lag(status, default = first(status)))) %>% ungroup() %>% # 按连续段聚合 group_by(country, spell_id, status) %>% summarise( time1 = as.character(min(year)), time2 = as.character(max(year) + 1), # 求和处理:全NA则返回NA,否则返回求和值 treatment = ifelse(all(is.na(treatment)), NA_character_, as.character(sum(treatment, na.rm = TRUE))) ) %>% ungroup() %>% select(country, time1, time2, status, treatment)
运行后得到的Df_result和你提供的目标格式Df2完全一致。
内容的提问来源于stack exchange,提问作者Carmela
相关产品推荐
相关产品推荐

