如何基于属性对R语言中自定义类的实例列表进行排序?
如何对自定义类实例列表按属性排序?
嘿,先给你提个小细节:你写的循环里索引写错啦!应该是each_individual[[i]]而不是each_individual[[p]],不然循环结束后所有实例都会被最后一个矩阵覆盖,先把这个小错误修正了再进行排序哦~
接下来给你两种常用的排序方法,不管你想用基础R还是tidyverse工具都能搞定:
基础R实现排序
要按Individual类的某个属性(比如你提到的average)排序,核心思路是先提取所有实例的目标属性值,再用这些值的排序索引重新排列原列表:
按average属性排序
# 升序排序(从小到大) sorted_individuals_asc <- each_individual[order(sapply(each_individual, function(x) x@average))] # 降序排序(从大到小),给属性值加负号即可 sorted_individuals_desc <- each_individual[order(-sapply(each_individual, function(x) x@average))]
这里each_individual是你的实例列表,sapply()会遍历每个实例,提取出它们的average属性组成一个数值向量;order()函数会返回这个向量排序后的索引位置,用这个索引去取原列表的元素,就得到了排序后的实例列表。
按mymat的特征排序
如果想基于mymat矩阵的某个特征排序(比如矩阵的行数、第一行的总和等),只需要修改提取属性的逻辑就行,比如按矩阵的行数升序排序:
sorted_by_mat_rows <- each_individual[order(sapply(each_individual, function(x) nrow(x@mymat)))]
用tidyverse的purrr包实现排序
如果你平时习惯用tidyverse生态的工具,purrr包的函数可以让代码更简洁直观:
library(purrr) # 按average升序排序 sorted_individuals <- each_individual[order(map_dbl(each_individual, ~ .x@average))] # 或者用purrr专门的list_order_by函数,可读性更强 sorted_individuals <- list_order_by(each_individual, map_dbl(each_individual, ~ .x@average))
map_dbl()和sapply类似,会把每个实例的average属性提取成数值向量,后续的排序逻辑和基础R一致。
内容的提问来源于stack exchange,提问作者Anu
相关产品推荐
相关产品推荐

