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

如何在R中按参数k重复数据框行并为新行指定列加前缀?

R优雅实现数据框重复行并添加前缀

需求说明

保留原始数据框的同时,新增k组数据:每组均为原始数据框的行副本,但指定列(如示例中的a列)会添加前缀(前缀从1到k),最终合并所有结果。

示例输入

df <- data.frame(a = c("1","2","3", "4"), b = c(1,2,3, 4), stringsAsFactors = FALSE)
# 输入结构
#   a b
# 1 1 1
# 2 2 2
# 3 3 3
# 4 4 4

示例输出(k=3时)

#   a b
# 1 1 1
# 2 2 2
# 3 3 3
# 4 4 4
# 5 1_1 1
# 6 1_2 2
# 7 1_3 3
# 8 1_4 4
# 9 2_1 1
# 10 2_2 2
# 11 2_3 3
# 12 2_4 4
# 13 3_1 1
# 14 3_2 2
# 15 3_3 3
# 16 3_4 4

实现方法

1. Base R 原生方式

无需额外依赖包,用基础函数完成:

k <- 3

# 生成带前缀的重复数据列表
repeated_list <- lapply(1:k, function(p) {
  temp <- df
  temp$a <- paste(p, temp$a, sep = "_")
  temp
})

# 合并原始数据与重复数据
final_df <- rbind(df, do.call(rbind, repeated_list))

2. Tidyverse 简洁写法

用dplyr+purrr组合,代码更紧凑直观:

library(dplyr)
library(purrr)

k <- 3

final_df <- df %>%
  bind_rows(
    map_dfr(1:k, ~ mutate(df, a = paste(.x, a, sep = "_")))
  )

3. Tidyverse 交叉组合写法

用tidyr::crossing生成所有组合,逻辑更清晰:

library(tidyverse)

k <- 3

final_df <- crossing(prefix = 0:k, df) %>%
  # 前缀为0时保留原始a值,否则拼接前缀
  mutate(a = if_else(prefix == 0, a, paste(prefix, a, sep = "_"))) %>%
  select(-prefix) %>%
  # 按原始行+重复组的顺序排列结果
  arrange(match(a, c(df$a, paste(rep(1:k, each = nrow(df)), df$a, sep = "_"))))

内容的提问来源于Stack Exchange,提问作者Union find

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:15:27