【问题标题】:aggregate data by 5min excluding max and min按 5 分钟聚合数据,不包括最大值和最小值
【发布时间】:2021-02-21 21:03:53
【问题描述】:

我有一个类似的数据框:

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

【问题讨论】:

  • 如果只有一个值,你想怎么得到输出

标签: r dplyr


【解决方案1】:

我们可以在按'TimeStamp_round'分组后取mean之前删除值的range

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

或者,如果有更多的列,并且只想为numeric 获取mean

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

【讨论】:

    猜你喜欢
    • 2017-08-31
    • 2021-01-13
    • 2023-04-03
    • 2015-10-01
    • 1970-01-01
    • 2022-06-14
    • 2014-02-22
    • 1970-01-01
    • 2012-01-21
    相关资源
    最近更新 更多