如何在R语言中按name分组并按+,-交替规则排序data.frame?
实现DataFrame的交替模式排序需求
嘿,我完全get到你的需求了——先按name字段分组排序,然后在每个组里让status按照+、-交替的顺序排列对吧?我给你准备了R语言的两种实现方案,不管你习惯用tidyverse系列的dplyr,还是想用基础R原生函数都能搞定。
首先先还原你的原始数据:
# 原始数据框 df <- data.frame( NUM = 1:10, status = c("+", "+", "+", "-", "-", "+", "-", "+", "-", "-"), name = c("A", "A", "B", "A", "A", "C", "C", "A", "B", "A") )
方案一:用dplyr(tidyverse风格)
核心思路是给每个name分组里的+和-分别标记「轮次」序号,然后按轮次排序实现交替效果:
library(dplyr) sorted_df <- df %>% group_by(name) %>% # 给每组内的+、-分别生成连续序号(比如第1个+是1,第1个-也是1) mutate( group_order = ifelse(status == "+", row_number()[status == "+"], row_number()[status == "-"]) ) %>% ungroup() %>% # 排序逻辑:先按name,再按轮次,最后让+排在-前面 arrange(name, group_order, status) %>% # 去掉辅助列 select(-group_order) # 查看结果 print(sorted_df)
方案二:用基础R(无需额外包)
如果不想加载第三方包,用基础R的ave和order函数也能实现同样效果:
# 给每个name-status组合生成组内序号 df$group_order <- ave(rep(1:nrow(df), nrow(df)), df$name, df$status, FUN = seq_along) # 按要求排序并重置行名 sorted_df <- df[order(df$name, df$group_order, df$status), ] row.names(sorted_df) <- NULL # 输出结果 print(sorted_df)
两种方案运行后都会得到你想要的目标结果:
NUM status name 1 1 + A 2 4 - A 3 2 + A 4 5 - A 5 8 + A 6 10 - A 7 3 + B 8 9 - B 9 6 + C 10 7 - C
简单拆解下逻辑:我们给每个name分组里的+和-各自编上独立的序号(比如第1个+是1,第1个-也是1),排序时先按name分组,再按这个「轮次序号」排序,最后让+排在-前面,这样就自然形成了+、-交替的排列模式啦。
内容的提问来源于stack exchange,提问作者zathura
相关产品推荐
相关产品推荐

