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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:22:38