如何在DataFrame的Pass分组末尾插入指定DataFrame
问题:在DataFrame的Pass分组末尾插入指定数据行
现有如下结构的R语言DataFrame df:
mut pi pos Pass A 1 1010 010 G 1 1010 010 T 1 2020 020 T 1 2020 020 C 1 2020 020 A 1 5010 030 G 1 5010 040 G 1 5010 040 G 1 5010 040 C 1 5010 040
需求:创建一个新的DataFrame,并将其插入到df中Pass列每个唯一分组的最后一行之后。用于插入的DataFrame创建代码如下:
vec <- c("N",0,3333,"SEP") df_insert<-as.data.frame(t(replicate(2, vec)))
期望得到的输出结果:
mut pi pos Pass A 1 1010 010 G 1 1010 010 N 0 3333 SEP N 0 3333 SEP T 1 2020 020 T 1 2020 020 C 1 2020 020 N 0 3333 SEP N 0 3333 SEP A 1 5010 030 N 0 3333 SEP N 0 3333 SEP G 1 5010 040 G 1 5010 040 G 1 5010 040 C 1 5010 040 N 0 3333 SEP N 0 3333 SEP
解决方案
方案1:使用dplyr包实现
可以借助dplyr的分组拆分与批量合并功能快速完成操作,步骤如下:
# 若未安装dplyr,先执行安装 # install.packages("dplyr") library(dplyr) # 定义原数据框 df <- data.frame( mut = c("A", "G", "T", "T", "C", "A", "G", "G", "G", "C"), pi = rep(1, 10), pos = c(1010, 1010, 2020, 2020, 2020, 5010, 5010, 5010, 5010, 5010), Pass = c("010", "010", "020", "020", "020", "030", "040", "040", "040", "040"), stringsAsFactors = FALSE ) # 创建插入用的DataFrame并统一列名 vec <- c("N",0,3333,"SEP") df_insert <- as.data.frame(t(replicate(2, vec)), stringsAsFactors = FALSE) colnames(df_insert) <- colnames(df) # 执行分组插入并合并结果 result_df <- df %>% group_split(Pass) %>% purrr::map_dfr(~ rbind(.x, df_insert)) # 查看最终结果 print(result_df)
方案2:基础R实现
如果不想依赖第三方包,也可以用基础R的循环逻辑完成:
# 定义原数据框 df <- data.frame( mut = c("A", "G", "T", "T", "C", "A", "G", "G", "G", "C"), pi = rep(1, 10), pos = c(1010, 1010, 2020, 2020, 2020, 5010, 5010, 5010, 5010, 5010), Pass = c("010", "010", "020", "020", "020", "030", "040", "040", "040", "040"), stringsAsFactors = FALSE ) # 创建插入用的DataFrame并统一列名 vec <- c("N",0,3333,"SEP") df_insert <- as.data.frame(t(replicate(2, vec)), stringsAsFactors = FALSE) colnames(df_insert) <- colnames(df) # 遍历每个Pass分组,合并数据 unique_pass <- unique(df$Pass) result_list <- list() for (p in unique_pass) { group_data <- df[df$Pass == p, ] combined_data <- rbind(group_data, df_insert) result_list[[p]] <- combined_data } # 合并所有分组结果 result_df <- do.call(rbind, result_list) print(result_df)
内容的提问来源于stack exchange,提问作者Paolo Lorenzini
相关产品推荐
相关产品推荐

