如何按列提取第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
相关产品推荐
相关产品推荐

