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

在R中根据条件在连续行之间插入指定行的技术问题

在R中满足条件插入行的解决方案

问题需求

当数据框中连续两行满足以下任一条件时,在两行之间插入一行(Column_A=0, Column_B=1, Column_C=0):

  • 第i行的Column_C为1,且第i+1行的Column_A为1
  • 第i行的Column_A为1,且第i+1行的Column_C为1

示例数据准备

先构造符合你提供的示例数据(移除空行):

df <- data.frame(
  Column_A = c(1, 0, 0, 0, 1),
  Column_B = c(0, 1, 0, 0, 0),
  Column_C = c(0, 0, 1, 1, 0)
)

方法一:基础R实现(无需额外包)

通过标记插入位置、合并索引的方式完成插入:

# 计算需要插入行的位置(标记在两行之间,用小数表示)
insert_positions <- which(
  (df$Column_C[-nrow(df)] == 1 & df$Column_A[-1] == 1) |
  (df$Column_A[-nrow(df)] == 1 & df$Column_C[-1] == 1)
) + 0.5

# 生成包含原行和插入位置的新索引序列
new_indices <- sort(c(1:nrow(df), insert_positions))

# 创建空的新数据框,按新索引初始化
new_df <- data.frame(
  Column_A = NA,
  Column_B = NA,
  Column_C = NA,
  row.names = new_indices
)

# 填充原数据到对应位置
new_df[as.integer(new_indices), ] <- df

# 填充插入行的固定值
new_df[is.na(new_df$Column_A), ] <- list(0, 1, 0)

# 重置行名
rownames(new_df) <- NULL

方法二:dplyr实现(tidyverse风格)

用lead()函数判断后续行的条件,再通过行绑定完成插入:

library(dplyr)

new_df <- df %>%
  mutate(
    # 标记当前行后是否需要插入行
    insert_after = (Column_C == 1 & lead(Column_A) == 1) |
                   (Column_A == 1 & lead(Column_C) == 1),
    # 定义要插入的行(无需插入时为NULL)
    insert_row = if_else(insert_after, 
                         list(data.frame(Column_A=0, Column_B=1, Column_C=0)),
                         list(NULL))
  ) %>%
  rowwise() %>%
  # 将原行和插入行组合成子数据框
  summarise(data = list(rbind(select(cur_data(), Column_A:Column_C), insert_row)), .groups = "drop") %>%
  # 合并所有子数据框
  bind_rows(data) %>%
  # 过滤可能的空行(最后一行标记插入时会产生)
  filter(!is.na(Column_A))

结果验证

运行上述代码后,新数据框new_df会在第4行和第5行之间插入目标行,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:15:57