gpt4 book ai didi

r - 查找并计算与条件匹配的连续观察值

转载 作者:行者123 更新时间:2023-12-04 15:44:30 25 4
gpt4 key购买 nike

我想统计连续观测值与条件匹配的次数。例如。在下面的 foo 中,我想统计 3 月份中 y 的连续值小于 平均值的一个标准差的天数那个月的 y。我的数据布局如下 foo:

library(lubridate)
foo <- data.frame(x=seq.Date(as.Date("1981/1/1"),
as.Date("2000/12/31"), "day"))
foo$y <- arima.sim(n = nrow(foo), list(ar = c(0.8)))

我已经想出了如何计算每年 3 月份 y 低于平均值一个标准差以上的天数:

bar <- foo %>% filter(month(x) == 3 & y < mean(y)-sd(y)) %>% 
group_by(year(x)) %>% tally()

我希望仅当符合条件的日子是连续的时候才计数。例如,如果 3 月的平均温度为 0 且 sd 为 1,并且 1990 年的 3 月 5 日、6 日和 7 日均低于 -1,则 1990 年的计数将为 3。如果 3 月 21 日也 < -1但 3 月 20 日和 22 日不 < -1,计数仍为 3,因为 3 月 21 日没有同样 < -1 的邻居。

我想 rle 开始发挥作用,但我不明白是如何发生的。

任何建议表示赞赏。

最佳答案

所以这应该有效。

foo %>%
separate(x, sep = "-", into = c("year", "month", "day")) %>%
filter(month == "03") %>%
group_by(year) %>%
mutate(z = y < mean(y)-sd(y),
g = {r <- rle(z)
r$values[r$lengths < 2] <- FALSE
inverse.rle(r)}) %>%
tally(g)

# A tibble: 20 x 2
year n
<chr> <int>
1 1981 2
2 1982 6
3 1983 4
4 1984 4
5 1985 3
6 1986 5
7 1987 3
8 1988 7
9 1989 5
10 1990 4
11 1991 7
12 1992 4
13 1993 6
14 1994 5
15 1995 3
16 1996 5
17 1997 5
18 1998 4
19 1999 6
20 2000 6

我留下了 zg 这样你就可以检查结果了。

更新: rle 获取一个序列并创建一个包含两个元素的对象: 1. lengths - 元素出现的频率在序列中连续重复。 2. values - 相应的值。

举个例子:

seq <- c("a", "a", "a", "b", "b", "c")

rle_obj <- rle(seq)

rle_obj
Run Length Encoding
lengths: int [1:3] 3 2 1
values : chr [1:3] "a" "b" "c"

现在您可以操纵序列了。例如将“b”变成 4 的序列而不是 2:

rle_obj$lengths[rle_obj$values == "b"] <- 4

inverse.rle(rle_obj)
[1] "a" "a" "a" "b" "b" "b" "b" "c"

希望这能给您一些启发。

关于r - 查找并计算与条件匹配的连续观察值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56451150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com