在R中按组求连续数集[duplicate]

r6hnlfcb  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(116)
    • 此问题在此处已有答案**:

Create grouping variable for consecutive sequences and split vector(5个答案)
昨天关门了。
按组查找 Dataframe 中的连续数字集的最简单方法是什么?我使用的数据示例具有以下格式,并且与热浪相关

year  day  temp
  2011  150  96 
  2011  151  96
  2011  152  97
  2011  166  98
  2011  167  99
  2011  168  98
  2011  169  99
  2012  177  96
  2012  178  96
  2012  179  95
  2012  180  98
  2012  195  100
  2012  196  99
  2012  197  99

对于每一年,我想计算有多少次连续的一天,这段时间有多长,以及每组的平均温度。

year  num.hw  length.hw  avg.temp
2011  1       3          96
2011  2       4          98.5
2012  1       4          97
2012  2       3          99

我试过使用dplyr并根据一天中的差异创建一个指标来检测差距,但这并不能让我达到所需的效果。最好的方法是什么?可以是dplyrdata.table或其他方法。

owfi6suc

owfi6suc1#

您可以使用cumsum(c(1, diff(day) != 1))生成连续日期组。

library(dplyr)

df %>%
  group_by(year) %>%
  mutate(num.hw = cumsum(c(1, diff(day) != 1))) %>%
  group_by(year, num.hw) %>%
  summarise(length.hw = n(), avg.temp = mean(temp), .groups = 'drop')

# # A tibble: 4 × 4
#    year num.hw length.hw avg.temp
#   <int>  <dbl>     <int>    <dbl>
# 1  2011      1         3     96.3
# 2  2011      2         4     98.5
# 3  2012      1         4     96.2
# 4  2012      2         3     99.3
数据
df <- read.table(text = "
  year  day  temp
  2011  150  96 
  2011  151  96
  2011  152  97
  2011  166  98
  2011  167  99
  2011  168  98
  2011  169  99
  2012  177  96
  2012  178  96
  2012  179  95
  2012  180  98
  2012  195  100
  2012  196  99
  2012  197  99", header = TRUE)
aor9mmx1

aor9mmx12#

数据表解决方案

与Darren Tsai的方法完全相同,他提出了一个很好的累积和方法。

library(data.table)

setDT(df)

df[, num.hw := cumsum(c(1, diff(day) != 1)), year]
df[, .(length.hw = .N, avg.temp = mean(temp)), by = .(year, num.hw)]

# year num.hw length.hw avg.temp
# 1: 2011      1         3   96.333
# 2: 2011      2         4   98.500
# 3: 2012      1         4   96.250
# 4: 2012      2         3   99.333

相关问题