You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言如何提取数据框每列前n大值对应行名并生成新表

实现代码

首先先修正你示例数据的小问题,直接给行名赋值字符向量才可以正常运行:

df <- data.frame(a = c(1,4,5,2), b = c(7,1,4,6), c = c(5,6,7,1))
rownames(df) <- c("w","x","y","z")

方案1:直接取每列前n大值对应行名(无重复值场景,匹配你给出的示例需求)

你要的n=2场景可以直接用以下代码实现:

n <- 2
# 按列遍历,对每列降序排序后取前n个的行名,转成data.frame格式
result <- apply(df, 2, function(col) {
  names(sort(col, decreasing = TRUE))[1:n]
}) |> as.data.frame()

运行后输出的result结构和你期望的完全一致:

abc
ywy
xzx

注:你给出的示例输出中c列第二行的z属于笔误,c列第二大值为6对应行名是x

方案2:保留你原有unique逻辑,取前n大唯一值对应行名

如果你的实际数据存在重复值,需要先取唯一的前n大数值再匹配行名,可以用以下代码,和你现有逻辑兼容:

n <- 5 # 可以按需求调整取值
result <- apply(df, 2, function(col) {
  # 保留你原有取前n大唯一值的逻辑
  top_unique_vals <- sort(unique(col), decreasing = TRUE)[1:n]
  # 匹配每个值对应的第一个行名,如果某值对应多行,去掉[1]即可返回所有匹配行名
  sapply(top_unique_vals, function(val) rownames(df)[which(col == val)[1]])
}) |> as.data.frame(, check.names = FALSE)

如果需要处理某前n大数值对应多个行的场景,把which(col == val)[1]里的[1]删除后,再用tidyr::unnest()展开即可得到所有匹配行名。


内容的提问来源于stack exchange,提问作者keenan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:24:08