如何使用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
相关产品推荐
相关产品推荐

