如何在R语言中识别数据中的并列人群组并进行相对排名?
在R中识别并列人群组并进行相对排名
可以实现,核心思路是基于多变量支配关系划分组:如果两个个体彼此都不满足「所有变量都≥对方且至少一个变量更大」,则归为同一组;组的排名由组间支配关系决定——若A组个体能支配B组个体,A组排名就高于B组。
具体实现步骤
- 加载并准备数据
df <- data.frame( person = c("person0", "person1", "person2", "person3", "person4", "person5", "person6"), var1 = c(11,10,5,2,1,0,0), var2 = c(11, 5, 10, 2,1,1,0), var3 = c(11, 10, 10, 2,0,1,0) )
- 定义支配关系函数
判断个体i是否支配个体j:i的所有变量都不小于j,且至少有一个变量严格大于j
dominates <- function(i, j, mat) { all(mat[i, ] >= mat[j, ]) && any(mat[i, ] > mat[j, ]) }
- 构建支配矩阵
生成n×n矩阵,标记每个个体是否支配另一个个体
num_mat <- as.matrix(df[, -1]) n <- nrow(num_mat) dom_mat <- matrix(FALSE, nrow = n, ncol = n) for (i in 1:n) { for (j in 1:n) { if (i != j) { dom_mat[i, j] <- dominates(i, j, num_mat) } } }
- 划分等价组
把彼此不互相支配的个体归为同一组
groups <- list() used <- rep(FALSE, n) for (i in 1:n) { if (!used[i]) { # 找到与i等价的所有个体:既不被i支配,也不支配i group_members <- which(!dom_mat[i, ] & !dom_mat[, i]) groups[[length(groups) + 1]] <- df$person[group_members] used[group_members] <- TRUE } }
- 对组进行排名
根据组间支配关系确定排名,支配其他组越多的组排名越高
# 计算组间支配关系 group_dom <- matrix(FALSE, nrow = length(groups), ncol = length(groups)) for (i in 1:length(groups)) { for (j in 1:length(groups)) { if (i != j) { i_idx <- which(df$person == groups[[i]][1]) j_idx <- which(df$person == groups[[j]][1]) group_dom[i, j] <- dominates(i_idx, j_idx, num_mat) } } } # 计算排名 rank_scores <- rowSums(group_dom) group_ranks <- rank(-rank_scores, ties.method = "min") # 整理最终结果 result <- data.frame( person = unlist(groups), group = rep(1:length(groups), sapply(groups, length)), rank = rep(group_ranks, sapply(groups, length)) ) print(result)
运行结果
person group rank 1 person0 1 1 2 person1 2 2 3 person2 2 2 4 person3 3 3 5 person4 4 4 6 person5 4 4 7 person6 5 5
这个结果完全匹配需求:person0单独为第1组(排名1),person1和person2为第2组(排名2),person3单独第3组(排名3),person4和person5为第4组(排名4),person6单独第5组(排名5)。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

