按episode分组将同组多行合并为单行,对treatment等变量执行聚合运算
实现方案
方案说明
输入数据中的treatment列存储的是字符串格式的"NA",需要先转换为数值型的缺失值,再按照country、episode、time1、time2、status分组(同组内这些字段取值完全一致),对treatment执行带缺失值忽略的求和即可匹配预期输出。
dplyr实现代码(最常用的分组处理方案)
# 加载依赖包 library(dplyr) Df2 <- Df %>% # 转换treatment为数值型,字符串"NA"会自动转为标准缺失值 mutate(treatment = as.numeric(as.character(treatment))) %>% # 按同组取值一致的字段分组 group_by(country, episode, time1, time2, status) %>% # 求和时忽略缺失值,全为缺失时求和结果为0 summarise(treatment = sum(treatment, na.rm = TRUE), .groups = "drop") %>% # 调整列顺序和示例输出保持一致 select(country, time1, time2, episode, status, treatment) %>% as.data.frame()
基础R实现代码(无需加载额外包)
# 处理treatment列的字符串NA,转为数值后将缺失值替换为0 Df$treatment <- as.numeric(as.character(Df$treatment)) Df$treatment[is.na(Df$treatment)] <- 0 # 按分组聚合求和 Df2 <- aggregate(treatment ~ country + episode + time1 + time2 + status, data = Df, FUN = sum) # 调整列顺序匹配输出要求 Df2 <- Df2[, c("country", "time1", "time2", "episode", "status", "treatment")]
输出验证
两种方案得到的结果均和预期完全一致:
country time1 time2 episode status treatment 1 A 1950 1951 1 0 10 2 A 1951 1953 2 1 20 3 A 1953 1954 3 0 5 4 A 1954 1955 4 1 0 5 B 1950 1951 1 1 0 6 B 1951 1952 2 0 30 7 B 1952 1954 3 1 110
内容的提问来源于stack exchange,提问作者Carmela
相关产品推荐
相关产品推荐

