如何编写类似which.min的函数,返回向量最小3个值对应的索引
获取向量最小3个值对应索引的R实现
直接使用R内置的order()函数即可高效实现需求,order(x)默认返回向量升序排列后的元素索引,取前3位就是最小3个值的对应索引:
which.min3 <- function(x) { head(order(x), 3) }
效果验证
可以用测试向量确认函数输出符合预期:
test_vec <- c(5, 2, 7, 1, 3, 1, 4) # 获取最小3个值的索引 min3_idx <- which.min3(test_vec) print(min3_idx) # 输出对应值验证结果 print(test_vec[min3_idx])
上述示例中,测试向量最小的两个值为第4、6位的1,第三小为第2位的2,函数返回索引为4 6 2,结果正确。
适配apply调用
该函数可以直接和apply()搭配使用,处理矩阵/数据框的按行/按列计算:
# 生成测试矩阵 test_mat <- matrix(rnorm(20), nrow = 4) # 按行计算每行最小3个值的索引 apply(test_mat, 1, which.min3)
对齐原有minfunc逻辑的版本
如果你需要和你现有minfunc的逻辑对齐,即优先取3个不同的最小值,再返回每个最小值第一次出现的索引,可以使用下面的实现:
which.min3_unique <- function(x) { # 取排序后前3个不同的最小值 min_vals <- unique(sort(x))[1:3] # 依次匹配每个最小值首次出现的索引 sapply(min_vals, function(v) which(x == v)[1]) }
内容的提问来源于stack exchange,提问作者Leah Bevis
相关产品推荐
相关产品推荐

