如何在R语言中对数据框的全部列执行升序排序?
解决每列独立升序排序的问题
你之前用order()的方式是按列优先级对行进行排序——先按a1升序排所有行,a1相同的行再按a2升序,以此类推,所以只有a1会是全局严格升序,其他列仅在对应分组内有序,不是你要的每列独立升序效果。
要实现所有列各自单独升序(每列数值从低到高排列,不保留原行的对应关系),可以用以下两种方法:
方法一:基础R实现
用apply()函数对每列单独执行排序,再转回dataframe:
# 生成示例数据(你的原代码) a1 = runif(n = 50, min = 0.1, max = 120) a2 = runif(n = 50, min = 5, max = 151) a3 = runif(n = 50, min = 1, max = 100) a4 = runif(n = 50, min = 6, max = 180) a5 = runif(n = 50, min = 6, max = 183) a6 = runif(n = 50, min = 6, max = 254) df = data.frame(a1,a2,a3,a4,a5,a6) # 每列独立升序排序 df_sorted <- as.data.frame(apply(df, 2, sort)) # 查看结果 head(df_sorted)
apply(df, 2, sort):2表示按列操作,对每列调用sort()函数(默认升序)as.data.frame():把apply返回的矩阵转回dataframe格式,保持原列名
方法二:tidyverse(dplyr)实现
如果你习惯用tidyverse语法,用across()对所有列应用排序:
library(dplyr) df_sorted <- df %>% mutate(across(everything(), sort)) head(df_sorted)
across(everything()):选中dataframe的所有列sort:对每列执行升序排序(如果要降序可以用~sort(., decreasing = TRUE))
这两种方法都能直接处理你348列的dataframe,不需要手动列出所有列名。
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

