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

