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

