首页 > 解决方案 > 根据分类运行进行总结

问题描述

我正在总结大量传感器数据。我需要提取 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

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

标签: rdplyr

解决方案


我们可以使用创建组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)]

推荐阅读