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

R语言如何对data.frame相邻列累加且保留0值计算个体年龄

解决方案

你可以通过按行遍历处理每个个体的观测序列实现需求,核心逻辑是:保留先导0,从首次出现1的位置开始累加计数,遇到首个0后后续全部置为0。

基础R实现

# 1. 先将原始数据的字符列转为数值型
df_num <- data.matrix(df)

# 2. 按行处理每个个体的观测序列
result_mat <- t(apply(df_num, 1, function(x) {
  # 找到所有存在记录(值为1)的位置
  exist_pos <- which(x == 1)
  # 无有效存在记录直接返回全0
  if (length(exist_pos) == 0) return(rep(0, length(x)))
  
  # 首次出现的位置、首次出现后第一个死亡(值为0)的位置
  start <- min(exist_pos)
  after_start <- x[start:length(x)]
  first_death <- which(after_start == 0)[1]
  end <- ifelse(is.na(first_death), length(x), start + first_death - 2)
  
  # 生成年龄序列
  res <- rep(0, length(x))
  res[start:end] <- seq_len(end - start + 1)
  res
}))

# 3. 转回data.frame格式
result_df <- as.data.frame(result_mat)
colnames(result_df) <- colnames(df)

运行后result_df即可得到你需要的输出结果。

tidyverse 实现(适合dplyr语法使用者)

library(dplyr)
library(purrr)

result_df <- df %>%
  # 转所有列为整数型
  mutate(across(everything(), as.integer)) %>%
  # 按行处理
  pmap_dfr(function(...) {
    x <- c(...)
    exist_pos <- which(x == 1)
    if (length(exist_pos) == 0) return(set_names(rep(0, length(x)), names(x)))
    start <- min(exist_pos)
    after_start <- x[start:length(x)]
    first_death <- which(after_start == 0)[1]
    end <- ifelse(is.na(first_death), length(x), start + first_death - 2)
    res <- rep(0, length(x))
    res[start:end] <- seq_len(end - start + 1)
    set_names(res, names(x))
  })

内容的提问来源于stack exchange,提问作者notiomystiscincta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:57:00