如何在R语言中按指定模式动态交替排列数据框列?
动态交替排列大型数据集列的解决方案
问题背景
通过for循环导入16个数据框后,使用以下代码合并所有数据框:
### Merge all dataframes: mergefun <- function(x, y) merge(x, y, by= "ID", all = T) merged_DF <- Reduce(mergefun, dataList)
合并后的列名包含NARR/ARG、G1/G2、数值(50/100/150/200)、后缀(AAA/AAC/AC/AB)等元素,需要实现两种无需手动指定列的动态列排列方式:
- SET 1:按50→100→150→200递增排序,每个数值组内交替
G1和G2列(如NARR_G1_50_AAA, NARR_G2_50_AAA, NARR_G1_50_AAC, NARR_G2_50_AAC...) - SET 2:按50→100→150→200递增排序,每个
G组内交替NARR和ARG列(如NARR_G1_50_AAA, ARG_G1_50_AAA, NARR_G1_50_AAC, ARG_G1_50_AAC...)
解决方案
核心思路是拆分列名到各个组成字段,根据不同排序规则生成列顺序,再重新排列数据框。需要用到dplyr和tidyr包。
实现SET 1排列
library(dplyr) library(tidyr) # 提取列名并拆分生成排序规则 col_order_set1 <- names(merged_DF) %>% tibble(col_name = .) %>% filter(col_name != "ID") %>% separate(col_name, into = c("type", "group", "value", "suffix"), sep = "_") %>% mutate(value = as.integer(value)) %>% # 排序优先级:数值 > 后缀 > 组(G1在前,G2在后) arrange(value, suffix, group) %>% pull(col_name) # 重新排列数据框 set1_df <- merged_DF %>% select(ID, all_of(col_order_set1))
实现SET 2排列
# 提取列名并拆分生成排序规则 col_order_set2 <- names(merged_DF) %>% tibble(col_name = .) %>% filter(col_name != "ID") %>% separate(col_name, into = c("type", "group", "value", "suffix"), sep = "_") %>% mutate(value = as.integer(value)) %>% # 排序优先级:数值 > 后缀 > 组 > 类型(NARR在前,ARG在后) arrange(value, suffix, group, type) %>% pull(col_name) # 重新排列数据框 set2_df <- merged_DF %>% select(ID, all_of(col_order_set2))
代码说明
- 拆分列名:用
separate()将复合列名拆分为type(NARR/ARG)、group(G1/G2)、value(50/100等)、suffix(AAA/AAC等)四个独立字段 - 数值类型转换:将
value转为整数,避免字符串排序导致的100排在50之前的问题 - 排序规则设置:
- SET 1通过
arrange(value, suffix, group)确保同一数值、后缀下,先出现G1列再出现G2列 - SET 2通过
arrange(value, suffix, group, type)确保同一数值、后缀、组下,先出现NARR列再出现ARG列
- SET 1通过
- 重新排列:用
select(ID, all_of(...))将ID列保留在首位,其余列按生成的顺序排列
内容的提问来源于stack exchange,提问作者Larissa Cury
相关产品推荐
相关产品推荐

