如何按群组生成条件累积计数?具体来说,我的数据有列:个人姓名,日期,月份和温度。我想生成一个表格,显示每个月内每个人的温度超过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
答案 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))