首页 > 解决方案 > 按 5 分钟聚合数据,不包括最大值和最小值

问题描述

我有一个像这样的数据框:

Time    <- seq.POSIXt(as.POSIXct("2017-11-14 00:01:00 CET"), as.POSIXct("2017-11-14 00:15:00 CET"), units = "minute", by=60)
A <- c(2,3,5,2,5,8,17,3,5,8,17,3,5,1,5)
B <- c(1,1,2,1,2,1,2,2,2,4,6,7,8,8,9)

DF <- data.frame(Time=Time, A=A, B=B)

我想要一个“newDF”,我将数据聚合 5 分钟,但是,对于每一列,聚合前的最大值/最小值除外。

使用 dplyr 我得到这样的东西:

DF$TimeStamp_round<-floor_date(DF$Time,unit="5 minutes")
DF<-DF %>%
  group_by(TimeStamp_round) %>%
  mutate(TimeStamp_count = cur_group_id())

newDF<-DF %>%
  group_by(TimeStamp_count) %>%
  summarise(across(where(is.numeric), mean))

但我仍然无法在 newDF 中的 summarise() 函数之前排除最大值/最小值

注意:我不想为每一列手动执行,因为在真正的 DF 中,列是 350

标签: rdplyr

解决方案


我们可以在通过 'TimeStamp_round' 进行分组range之前删除这些值mean

library(dplyr)
DF %>%
     group_by(TimeStamp_round) %>% 
     summarise(across(A:B, ~ mean(.[!. %in% range(.)])), .groups = 'drop')

或者,如果有更多列并且想要获得mean唯一的numeric

DF %>%
    select(-Time) %>%
    group_by(TimeStamp_round) %>% 
    summarise(across(where(is.numeric), 
           ~ mean(.[!. %in% range(.)])), .groups = 'drop')

推荐阅读