【问题标题】:Summarise based on categorical runs根据分类运行进行总结
【发布时间】:2019-07-16 10:55:54
【问题描述】:

我正在总结大量传感器数据。 我需要提取 1.) 特定类别的最大运行长度和 2.) 运行中所有变量的汇总统计信息。

例如数据:

require(dplyr)
    fruit <- as.factor(c('apple','apple','banana','banana','banana','guava','guava','guava','guava','apple','apple','apple','banana','guava'))
    duration <- c(1,2,1,2,3,1,2,3,4,1,2,3,1,1)
    set.seed(14)
    temp <- round(runif(14, 80.0, 105.0))
    test <- data.frame(duration, fruit, temp)
#Example Data Frame
duration  fruit   temp
 1        apple   86
 2        apple   96
 1        banana  104
 2        banana  94
 3        banana  105
 1        guava   93
 2        guava   103
 3        guava   91
 4        guava   92
 1        apple   90
 2        apple   102
 3        apple   84
 1        banana  92
 1        guava   101

我可以通过将每一行与前面的行进行比较来查看它们是否不同,从而完成 #1。

但是,此结果还返回最后一行的单个 Temp 条目,我希望能够计算 Temp 数据的各种摘要,例如平均值。

test %>% filter((lead(`fruit`) != `fruit`)| is.na(lead(`fruit`)) )

我想结束的框架更像是:

test %>%
  filter((lead(`fruit`) != `fruit`)| is.na(lead(`fruit`)) ) %>%
  select(-temp) %>%
  mutate(mean_temp = c(91,101,94.8,92,92,101))
##Goal Output
duration  fruit      mean_temp
2         apple      91.0
3         banana     101.0
4         guava      94.8
3         apple      92.0
1         banana     92.0
1         guava      101.0

关于如何有效地做到这一点的任何想法?

【问题讨论】:

  • 查看rle()data.table::rleid

标签: r dplyr


【解决方案1】:

我们可以使用lagcumsum 创建组,然后计算每个组的统计数据。

library(dplyr)

test %>%
  group_by(group = cumsum(fruit != lag(fruit, default = first(fruit)))) %>%
  summarise(fruit = first(fruit), 
            duration = n(), 
            mean_temp = mean(temp)) %>%
  select(-group)

#  fruit  duration mean_temp
#  <fct>     <int>     <dbl>
#1 apple         2      91  
#2 banana        3     101  
#3 guava         4      94.8
#4 apple         3      92  
#5 banana        1      92  
#6 guava         1     101  

也可以使用data.table::rleid 替换group_by 行来创建组

group_by(group = data.table::rleid(fruit))

或使用rle

group_by(group = with(rle(as.character(fruit)), rep(seq_along(values), lengths)))

或使用data.table

library(data.table)
setDT(test)[, .(duration = .N, fruit = fruit[1L], 
                mean_temp = mean(temp)), by = rleid(fruit)]

【讨论】:

    猜你喜欢
    • 2021-10-28
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    相关资源
    最近更新 更多