如何基于另一列值对R数据框列进行分组重排与因子水平调整
按国家分组调整perc_type的排序方案
当然可以实现这个需求,下面提供几种实用的方法:
方法1:用dplyr分组提取百分比数值排序
这种方法会动态提取perc_type中的百分比数字,按数值大小在每个国家分组内排序:
library(dplyr) test_sorted <- test %>% group_by(country) %>% # 提取百分比部分并转为数值 mutate(perc_num = as.numeric(sub("%.*", "", perc_type))) %>% # 按百分比数值升序排序,保持分组 arrange(perc_num, .by_group = TRUE) %>% # 移除临时生成的perc_num列 select(-perc_num)
方法2:自定义因子水平固定排序
如果需要固定perc_type的显示顺序,可将其转换为因子并指定自定义水平:
# 先提取所有perc_type的正确顺序(按百分比升序) correct_levels <- test %>% mutate(perc_num = as.numeric(sub("%.*", "", perc_type))) %>% arrange(perc_num) %>% pull(perc_type) %>% unique() # 将perc_type转为因子,指定正确的水平顺序 test$perc_type <- factor(test$perc_type, levels = correct_levels) # 按国家和perc_type排序 test_sorted <- test %>% arrange(country, perc_type)
方法3:针对不同后缀的批量因子水平定义
如果每个国家的perc_type后缀不同(比如a、bx、cy),可以基于百分比模板批量生成正确的因子水平:
# 定义基础的百分比顺序 base_perc <- c("50%", "100%", "200%", "300%") # 为每个国家生成对应的perc_type水平 correct_levels <- unlist(lapply(unique(test$country), function(c) { # 获取当前国家的后缀 suffix <- sub(".*: ", "", test$perc_type[test$country == c][1]) paste0(base_perc, ": ", suffix) })) # 转换为因子并排序 test$perc_type <- factor(test$perc_type, levels = correct_levels) test_sorted <- test %>% arrange(country, perc_type)
运行上述任意一种方法后,每个country分组内的perc_type都会按50%、100%、200%、300%的升序排列。
内容的提问来源于stack exchange,提问作者i.b
相关产品推荐
相关产品推荐

