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

如何在R中整理数据结构以开展PWP复发事件分析?

R转换数据为PWP复发事件分析格式方法

实现核心逻辑:将每个国家内连续**状态(status)**相同的年份合并为一个计数过程区间,同时对区间内的treatment值求和,完全匹配PWP复发事件模型要求的(time1, time2)计数过程数据结构。

实现步骤

  1. 数据预处理:修正原数据中字符串类型的"NA"为R可识别的缺失值,转换相关字段为数值类型方便计算
  2. 识别连续状态段:按国家分组后,标记状态变化的节点,给连续相同状态的时间段分配唯一分组ID
  3. 聚合生成目标格式:按国家、状态、连续段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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:54:03