如何在R中按行计算诊断至死亡期间的保险月度参保值之和
问题描述
我有一个记录月度保险参保情况(M1至M5)的数据集,同时包含诊断月份(T1)与死亡月份(T2)变量。需要计算从诊断月份对应M列到死亡月份对应M列的数值之和,以此判断该时段是否持续参保。
示例数据集代码:
r1 <- c(1,3,4,0,0,1,1,0) r2 <- c(2,3,5,0,0,1,0,0) r3 <- c(3,1,4,1,1,1,1,0) df <- as.data.frame(rbind(r1,r2,r3)) colnames(df) <- c("ID", "T1", "T2", "M1", "M2", "M3", "M4", "M5")
期望新增sum列后的结果:
df$sum <- c(2,1,4) df
我尝试过将T1、T2转换为对应列名,但不知道如何基于其值选择列并计算求和。
解决方案
方法1:基础apply逐行处理
通过apply遍历每一行,根据T1和T2生成对应的列名范围,再提取列值求和:
df$sum <- apply(df, 1, function(row) { # 生成起始和结束的M列名 start_col <- paste0("M", row["T1"]) end_col <- paste0("M", row["T2"]) # 提取该范围的列并求和 sum(row[start_col:end_col]) })
方法2:Tidyverse风格实现
使用dplyr的rowwise()逐行处理,结合c_across()选择列范围:
library(dplyr) df <- df %>% rowwise() %>% mutate( sum = sum(c_across(paste0("M", T1):paste0("M", T2))) ) %>% ungroup()
方法3:基于列位置的高效计算
由于M列是连续排列的,可以直接通过列索引计算,避免字符串转换,效率更高:
# 获取M1列的位置索引 m_col_start <- which(colnames(df) == "M1") # 用mapply逐行计算范围求和 df$sum <- mapply(function(t1, t2, row_data) { # 计算对应M列的索引范围 col_indices <- (m_col_start + t1 - 1):(m_col_start + t2 - 1) sum(row_data[col_indices]) }, df$T1, df$T2, split(df[, m_col_start:ncol(df)], seq(nrow(df))))
内容的提问来源于stack exchange,提问作者KJohn
相关产品推荐
相关产品推荐

