如何按a列优先于b列的规则找出数据框中对应最小值的行号?
按多列优先级查找数据框最小值对应的行号
针对你的需求,这里提供几种R语言的实现方法,都能得到期望的第5行结果:
方法一:基础R分步处理
通过分步筛选锁定目标行,逻辑清晰易懂:
# 定义样本数据 dat = data.frame('a' = c(4,5,6,8,2,2, 5), 'b' = c(23, 45, 12, 11, 1, 3, 4)) # 1. 获取a列的最小值 min_a <- min(dat$a) # 2. 筛选出a列等于最小值的所有行 subset_a <- dat[dat$a == min_a, ] # 3. 在筛选出的子集中找到b列最小的行,提取原数据框的行号并转成数值 result_row <- as.numeric(rownames(subset_a)[which.min(subset_a$b)]) # 输出结果 print(result_row) # 输出:5
方法二:基础R排序取首行
利用order()函数直接按优先级排序,取排序后的第一行行号:
dat = data.frame('a' = c(4,5,6,8,2,2, 5), 'b' = c(23, 45, 12, 11, 1, 3, 4)) # 按a列升序、b列升序排序,取第一行的原行号 result_row <- as.numeric(rownames(dat[order(dat$a, dat$b), ])[1]) print(result_row) # 输出:5
方法三:dplyr包实现(tidyverse风格)
如果习惯使用tidyverse工具链,可以用dplyr的链式操作:
library(dplyr) dat = data.frame('a' = c(4,5,6,8,2,2, 5), 'b' = c(23, 45, 12, 11, 1, 3, 4)) result_row <- dat %>% arrange(a, b) %>% # 按a、b列升序排列 slice(1) %>% # 取排序后的第一行 rownames() %>% # 提取原行号 as.numeric() # 转成数值类型 print(result_row) # 输出:5
内容的提问来源于stack exchange,提问作者Bogaso
相关产品推荐
相关产品推荐

