我会做这样的事情。我会data.table
在这里使用。
df <- read.table(header=TRUE, text="dates temp
01/31/2011 40
01/30/2011 34
01/29/2011 30
01/28/2011 52
01/27/2011 39
01/26/2011 37", stringsAsFactors=FALSE)
require(data.table)
dt <- data.table(df)
dt <- dt[, `:=`(date.form = as.Date(dates, format="%m/%d/%Y"),
id = cumsum(as.numeric(temp >= 40)))][temp < 40]
dt[, list(from=min(date.form), to=max(date.form), count=.N), by=id]
# id from to count
# 1: 1 2011-01-29 2011-01-30 2
# 2: 2 2011-01-26 2011-01-27 2
这个想法是首先创建一个列,该dates
列首先转换为Date
格式。然后,另一列id
找到 where 的位置temp >= 40
并使用它来创建在 two 范围内的值组temp>=40
。也就是说,如果你有c(40, 34, 30, 52, 39, 37)
,那么你会想要c(1,1,1,2,2,2)
。也就是说, 到 values 之间的所有内容都>= 40
必须属于同一组(34, 30 -> 1 和 39, 37 -> 2)。这样做之后,我会删除temp >= 40
条目。
然后,您可以按此组拆分,然后取min
and max
(length(.)
默认存储在 中.N
)。