R语言大数据框如何按行替换数值序列 补全0/1观测缺口
解决方案
核心逻辑为:逐行扫描,定位每行第一个1和最后一个1的位置,将两个位置之间的所有值统一替换为1,其余位置保持原值即可。
基础R实现(代码更简洁,适合小数据集)
# 1. 先将数据转为数值型,避免字符型判断出错 df[] <- lapply(df, function(x) as.numeric(as.character(x))) # 2. 逐行处理 df_result <- t(apply(df, 1, function(row) { # 提取当前行所有1的位置 one_pos <- which(row == 1) # 若该行无观测记录,直接返回原行 if (length(one_pos) == 0) return(row) # 定位首尾1的位置 start <- min(one_pos) end <- max(one_pos) # 首尾之间的所有值替换为1 row[start:end] <- 1 return(row) })) |> as.data.frame() # 查看结果 df_result
tidyverse实现(适合dplyr语法使用者)
library(dplyr) library(tidyr) df_result <- df |> # 所有列转数值型 mutate(across(everything(), ~as.numeric(as.character(.x)))) |> rowwise() |> mutate( row_vals = list(c_across(everything())), one_pos = list(which(row_vals == 1)), start = min(one_pos, na.rm = TRUE), end = max(one_pos, na.rm = TRUE) ) |> # 展开为原始列结构 unnest_wider(row_vals, names_repair = ~colnames(df)) |> # 替换首尾1之间的值为1 mutate(across(1:ncol(df), ~ifelse(cur_column() %in% start:end, 1, .x))) |> # 保留原始列顺序 select(all_of(colnames(df))) |> ungroup()
运行上述任意一段代码,得到的结果都和预期输出完全一致,400行的数据集运行无性能压力。
内容的提问来源于stack exchange,提问作者notiomystiscincta
相关产品推荐
相关产品推荐

