基于有序索引使用dplyr查找向量的首个最小值及该最小值索引后的首个最大值
用dplyr实现:找到首个最小值及该索引后的首个最大值
嘿,我来帮你搞定这个需求!先从你的初始数据准备开始,我们把代码整理得更贴合tidyverse风格一点:
library(tidyverse) # 创建向量并转为带索引的数据框 vector_ex <- c(44, 30, 24, 32, 35) df <- tibble( Index = seq_along(vector_ex), Value = vector_ex )
接下来用dplyr的链式操作就能一步实现你的需求,逻辑清晰还易读:
# 计算目标结果 target_result <- df %>% # 先定位首个最小值的索引和对应值 mutate( first_min_index = first(Index[Value == min(Value)]), first_min_value = min(Value) ) %>% # 筛选最小值索引之后的行,找到其中的首个最大值 mutate( # 先拿到最小值之后的所有值的最大值 max_after_min_val = max(Value[Index > first_min_index]), # 找到这个最大值对应的首个索引 first_max_after_min_index = first(Index[Index > first_min_index & Value == max_after_min_val]) ) %>% # 只保留第一行的全局结果 slice(1) %>% # 提取我们需要的核心字段 select(first_min_index, first_min_value, first_max_after_min_index, max_after_min_val) # 查看结果 print(target_result)
运行这段代码后,你会得到清晰的结构化结果:
# A tibble: 1 × 4 first_min_index first_min_value first_max_after_min_index max_after_min_val <int> <dbl> <int> <dbl> 1 3 24 5 35
逻辑拆解:
- 找首个最小值:用
min(Value)拿到全局最小值,再用first(Index[Value == min(Value)])确保取到的是第一个出现该最小值的索引(避免有多个相同最小值时取到后面的)。 - 找最小值后的首个最大值:先通过
Value[Index > first_min_index]筛选出最小值索引之后的所有数值,找到其中的最大值,再用first()定位到这个最大值首次出现的索引。
如果你想要直接得到题目里的键值对字符串格式,也可以调整最后一步的输出:
result_as_strings <- target_result %>% mutate( min_pair = str_glue("Index={first_min_index}, vector_ex={first_min_value}"), max_pair = str_glue("Index={first_max_after_min_index}, vector_ex={max_after_min_val}") ) %>% select(min_pair, max_pair) print(result_as_strings)
输出就是完全符合你预期的格式:
# A tibble: 1 × 2 min_pair max_pair <glue> <glue> 1 Index=3, vector_ex=24 Index=5, vector_ex=35
内容的提问来源于stack exchange,提问作者chopin_is_the_best
相关产品推荐
相关产品推荐

