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
相关产品推荐
相关产品推荐

