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

如何按列提取第2高值及对应日期并生成新DataFrame

解决方案:提取每列第二高值及对应日期

我来帮你搞定这个需求!结合dplyr和tidyr的工具就能轻松实现,下面是完整的代码和步骤说明:

1. 先重现你的数据集

date<-as.Date(c("2007-01-01","2007-01-02","2007-01-03","2007-01-04","2007-01-05"))
a<-c(55,8,3,7,126)
b<-c(3,199,7,66,8)
c<-c(91,333,2,9,4)
df<-data.frame(date,a,b,c)

2. 核心处理代码

library(dplyr)
library(tidyr)

# 生成目标DataFrame
result <- df %>%
  # 把宽表转成长表,让a/b/c变成Type列的取值
  pivot_longer(cols = -date, names_to = "Type", values_to = "Value") %>%
  # 按Type分组,确保每列单独处理
  group_by(Type) %>%
  # 每个分组内按数值从大到小排序
  arrange(desc(Value), .by_group = TRUE) %>%
  # 选取每个分组的第2行(即第二高值)
  slice(2) %>%
  # 重命名列以匹配你要的格式
  rename(Date = date, "2nd highest" = Value) %>%
  # 调整列的顺序
  select(Type, Date, "2nd highest") %>%
  # 取消分组
  ungroup()

# 查看结果
print(result)

3. 运行结果

执行后会得到完全符合你要求的输出:

# A tibble: 3 × 3
  Type  Date       `2nd highest`
  <chr> <date>             <dbl>
1 a     2007-01-01            55
2 b     2007-01-04            66
3 c     2007-01-01            91

关键步骤解释

  • pivot_longer:这一步是关键,把原来的宽格式数据转换为长格式,让我们可以按Type(a/b/c)分组处理每一列的数据。
  • arrange(desc(Value), .by_group = TRUE):在每个分组内对数值降序排序,保证最大的值在第一行,第二大的在第二行。
  • slice(2):直接选取每个分组的第二行,精准拿到第二高值对应的日期和数值。

扩展说明

如果你的数据中存在并列第二高的情况,可以把slice(2)换成slice_head(n=2) %>% distinct(Value, .keep_all = TRUE),这样可以保留所有并列第二的记录(如果有的话)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:14:15