按组连续计数

时间:2016-12-21 02:03:39

标签: r count

如何按群组生成条件累积计数?具体来说,我的数据有列:个人姓名,日期,月份和温度。我想生成一个表格,显示每个月内每个人的温度超过38℃的连续天数。

一个答案解释了如何按组进行累积计数(如何按顺序在另一列上执行按列连续计数),但我不确定如何添加条件我只想要累计计数温度大于38℃的条件。

这是原始表的样子:

Individual name | Month | Date   | Temperature
Greg            | 1     | 2/1/16 | 26
Greg            | 1     | 3/1/16 | 25
Greg            | 1     | 4/1/16 | 39
Greg            | 1     | 5/1/16 | 39
Fred            | 1     | 2/1/16 | 40
Fred            | 1     | 3/1/16 | 41
Fred            | 1     | 4/1/16 | 41
Fred            | 1     | 5/1/16 | 41

这就是我想要生成的内容:

Individual name | Month | Largest consecutive string of days >38oC
Greg            | 1     | 2
Fred            | 1     | 4

2 个答案:

答案 0 :(得分:1)

这是另一个不需要函数的dplyr选项

library(dplyr)
df1 %>%
  group_by(Individual_name, Month) %>%
  filter(Temperature>38 & lag(Temperature, n=1L)>38) %>%
  summarise(consecutive=n()+1)

答案 1 :(得分:0)

以下是使用data.table的选项。转换' data.frame'到' data.table' (setDT(df1)),按个人名称'分组,'月'和逻辑向量(Temperature > 31)的run-length-id,我们得到逻辑向量的sum,然后按' Individual_name'和'月',从前一步中获取汇总列的max值(' V1')。

library(data.table)
setDT(df1)[, sum(Temperature > 31), .(Individual_name, Month, grp=rleid(Temperature > 31))
      ][, .(LargestConsec = max(V1)), .(Individual_name, Month)]
#   Individual_name Month LargestConsec
#1:            Greg     1             2
#2:            Fred     1             4

或者使用dplyr,我们根据“值”中的TRUE元素提取rle,然后使用lengths创建一个函数。 (因为我们在逻辑向量上执行rle)。由个人名称'组成。和'月',将功能应用于'温度'获得最大连续组的summarize d计数。

f1 <- function(vec, thresh) {
    with(rle(vec > thresh), max(lengths[values]))
}

library(dplyr)
df1 %>% 
    group_by(Individual_name, Month) %>% 
    summarise(LargestConsec = f1(Temperature, 31))
#   Individual_name Month LargestConsec
#            <chr> <int>         <int>
#1            Fred     1             4
#2            Greg     1             2

数据

df1 <- structure(list(Individual_name = c("Greg", "Greg", "Greg", "Greg", 
"Fred", "Fred", "Fred", "Fred"), Month = c(1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L), Date = c("2/1/16", "3/1/16", "4/1/16", "5/1/16", 
"2/1/16", "3/1/16", "4/1/16", "5/1/16"), Temperature = c(26L, 
25L, 39L, 39L, 40L, 41L, 41L, 41L)), .Names = c("Individual_name", 
"Month", "Date", "Temperature"), class = "data.frame", row.names = c(NA, 
-8L))