R中嵌套列表基于显著差异的排序及元素位置频次统计方案
实现步骤与代码
1. 需求核心逻辑
- 解决相同数值的并列排名问题,避免相同值被分配不同排名
- 跨所有子列表统计元素在各排名位置的出现频次
- 兼容不同子列表元素长度不一致的场景
2. 完整实现代码
2.1 数据定义
degree.l <- list(c(schwab = 0, pnc = 0.0344827586206897, jpm = 0.0862068965517241, amex = 0.0862068965517241, gs = 0.103448275862069, ms = 0.103448275862069, bofa = 0.103448275862069, citi = 0.103448275862069, wf = 0.120689655172414, spgl = 0.120689655172414, brk = 0.137931034482759), c(schwab = 0.0166666666666667, pnc = 0.05, ms = 0.0666666666666667, spgl = 0.0833333333333333, jpm = 0.1, bofa = 0.1, wf = 0.1, amex = 0.1, gs = 0.116666666666667, brk = 0.116666666666667, citi = 0.15), c(schwab = 0.0428571428571429, gs = 0.0714285714285714, pnc = 0.0714285714285714, citi = 0.0857142857142857, amex = 0.0857142857142857, spgl = 0.0857142857142857, jpm = 0.1, brk = 0.1, ms = 0.114285714285714, wf = 0.114285714285714, bofa = 0.128571428571429))
2.2 并列排名计算与频次统计
# 为每个子列表生成符合并列规则的排名,ties.method可根据需求调整 rank_list <- lapply(degree.l, function(x) { rk <- rank(x, ties.method = "min") sorted_rk <- sort(rk) data.frame(element = names(sorted_rk), rank = unname(sorted_rk)) }) # 合并所有子列表的排名结果 all_rank_data <- do.call(rbind, rank_list) # 生成元素-排名出现频次统计表 rank_freq <- table(element = all_rank_data$element, rank = all_rank_data$rank)
2.3 可选:优化展示效果
# 转为结构化数据框,过滤空值并增加占比统计 freq_df <- as.data.frame(rank_freq, responseName = "appear_count") freq_df <- freq_df[freq_df$appear_count > 0, ] # 按元素和排名排序 freq_df <- freq_df[order(freq_df$element, freq_df$rank), ] # 计算每个元素各排名的占比 freq_df$appear_pct <- ave(freq_df$appear_count, freq_df$element, FUN = function(x) round(x/sum(x)*100, 2))
3. 关键参数说明
rank()函数的ties.method参数可按需选择并列处理逻辑:
min:相同值统一取最小排名,示例中4个相同的元素(gs、ms、bofa、citi)排名均为5,下一个不同值排名为9max:相同值统一取最大排名,上述4个元素排名均为8,下一个不同值排名为9average:相同值取平均排名,上述4个元素排名均为6.5
该实现自动兼容不同子列表元素长度不一致的场景,统计结果无遗漏。
内容的提问来源于stack exchange,提问作者statwoman
相关产品推荐
相关产品推荐

