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

如何使用dplyr的add_row函数在指定行前批量插入多行?

在指定多行前插入特定值新行的高效实现方法

需求说明

需要在数据框的指定行号之前插入包含特定值(示例为"lol")的新行,现有数据及指定行号如下:

library(dplyr)
df <- data.frame(col1 = c("a","b","c","d"),
                 col2 = c("w","x","y","z"))
n <- c(1, 2, 4) # 需在这些行号之前插入新行

但dplyr的add_row()函数的.before参数仅支持传入单个行号,现寻求无需循环的高效实现方法。

解决方案

方法一:构造位置索引合并行

通过给插入行标记小数位置索引,和原数据行的整数索引合并后排序,实现按顺序拼接:

library(dplyr)
library(tibble)

# 创建与插入次数匹配的新行数据框
insert_rows <- tibble(col1 = "lol", col2 = "lol") %>% slice(rep(1, length(n)))

# 构造原数据索引与插入位置标记
combined <- tibble(
  idx = c(seq(nrow(df)), n - 0.5), # 用小数标记插入位置在目标行之前
  row_data = list(df) %>% bind_rows(insert_rows) %>% split(seq(nrow(.)))
) %>% arrange(idx)

# 提取最终结果
result <- combined %>% pull(row_data) %>% bind_rows()
print(result)

方法二:利用uncount扩展行后替换值

借助tidyr::uncount扩展需要插入行的位置,再替换对应位置的值,代码更简洁:

library(dplyr)
library(tidyr)

result <- df %>%
  mutate(need_insert = row_number() %in% n) %>%
  uncount(1 + need_insert, .id = "type") %>% # 需插入的行扩展为2行
  mutate(across(col1:col2, ~ifelse(type == 1 & need_insert, "lol", .))) %>%
  select(-need_insert, -type)

print(result)

两种方法均采用向量化操作,避免了循环,处理大数据框时效率更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:40:33