如何重新调整R中bind_rows合并的DataFrame行顺序?
R语言中重新排列合并后DataFrame的行顺序
方法1:利用dplyr(tidyverse)通用方案
适合任意数量的原始DataFrame,且每个原始DF行数可相同或不同:
- 合并时添加来源标记(若已完成合并,也可根据行号手动划分来源):
library(dplyr) # 示例数据构造 A <- data.frame(col1 = c("rowA1", "rowA2", "rowA3"), value = 1:3) B <- data.frame(col1 = c("rowB1", "rowB2", "rowB3"), value = 4:6) C <- data.frame(col1 = c("rowC1", "rowC2", "rowC3"), value = 7:9) # 合并时添加来源标识列 df <- bind_rows(A, B, C, .id = "source")
- 生成每行在原始DF中的位置,再按位置+来源排序:
df_reordered <- df %>% group_by(source) %>% mutate(pos = row_number()) %>% # 标记行在原始DF内的顺序 ungroup() %>% arrange(pos, source) %>% # 先按组内位置排序,再按原始DF顺序排列 select(-source, -pos) # 可选:移除辅助列
方法2:Base R简洁方案(适用于各原始DF行数相同的场景)
如果所有原始DataFrame的行数一致(比如都是3行),可以直接生成排序索引快速重排:
# 假设df是合并后的目标DataFrame n_per_df <- 3 # 单个原始DF的行数 n_dfs <- 3 # 参与合并的DF数量 # 生成排序索引:优先按组内位置排序 idx <- order(rep(1:n_per_df, n_dfs)) df_reordered <- df[idx, ]
原理:合并后的行对应位置标记为c(1,2,3,1,2,3,1,2,3),order()会将所有标记为1的行前置,接着是标记为2、3的行,正好得到需求的顺序。
内容的提问来源于stack exchange,提问作者El Hocko
相关产品推荐
相关产品推荐

