r - 按 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
解决方案
我们可以在通过 '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')