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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:45:02