R语言循环实现按列提取高值对应行名并排序的问题求助
解决方案:用循环实现按列提取降序行名
首先,你之前的代码报错核心原因有两个:
arrange(desc(i))未指定操作的数据框,且i是列名字符串,直接传入desc()只会对字符串排序,而非列中的数值- 变量名不统一(代码里用了
Sample_Ordering_Table和data,但你的示例数据是mydata)
下面分两种输出形式,用基础R循环实现你的需求:
一、生成列表形式的结果
初始化空列表,遍历每一列时提取该列降序对应的行名,再存入列表:
# 初始化空列表 sorted_row_list <- list() # 遍历mydata的每一列 for (col_name in colnames(mydata)) { # 对当前列数值降序排序,获取行名索引 sorted_index <- order(-mydata[[col_name]]) # 提取排序后的行名,取前4个(需全部结果可去掉head) sorted_rows <- head(rownames(mydata)[sorted_index], 4) # 用列名作为列表元素名,存入结果 sorted_row_list[[col_name]] <- sorted_rows } # 查看结果 sorted_row_list
运行后会得到和示例一致的列表,每个元素对应一列的降序行名。
二、生成表格形式的结果
如果需要将结果整理成数据框,只需在循环中把每列结果添加为新列:
# 初始化空数据框 sorted_row_df <- data.frame() for (col_name in colnames(mydata)) { sorted_index <- order(-mydata[[col_name]]) sorted_rows <- head(rownames(mydata)[sorted_index], 4) # 将当前列结果转为数据框的一列 sorted_row_df[[col_name]] <- sorted_rows } # 查看结果 sorted_row_df
用tidyverse风格改写循环(可选)
如果你习惯dplyr语法,可调整循环写法,注意用.data[[col_name]]引用字符串格式的列名:
library(dplyr) library(tibble) sorted_row_list <- list() for (col_name in colnames(mydata)) { sorted_rows <- mydata %>% rownames_to_column("row_name") %>% arrange(desc(.data[[col_name]])) %>% slice_head(n = 4) %>% pull(row_name) sorted_row_list[[col_name]] <- sorted_rows }
内容的提问来源于stack exchange,提问作者Riley Risteen
相关产品推荐
相关产品推荐

