gpt4 book ai didi

r - 如何返回相隔至少 10 天的每年的每月最小值

转载 作者:行者123 更新时间:2023-12-04 23:50:23 28 4
gpt4 key购买 nike

我有一个每日时间序列,我想获得每年每个月的最小值,但我想确保结果至少相隔 10 天。更具体地说,让我们解释以下示例数据帧。

>Data
Years Months Days Date A B
1 2003 December 1 2003-12-01 10 10
2 2003 December 2 2003-12-02 10 10
3 2003 December 3 2003-12-03 10 10
4 2003 December 4 2003-12-04 10 10
5 2003 December 5 2003-12-05 10 10
6 2003 December 6 2003-12-06 10 10
7 2003 December 7 2003-12-07 10 10
8 2003 December 8 2003-12-08 3 10
9 2003 December 9 2003-12-09 10 10
10 2003 December 10 2003-12-10 10 10
11 2003 December 11 2003-12-11 10 10
12 2003 December 12 2003-12-12 10 4
13 2003 December 13 2003-12-13 10 10
14 2003 December 14 2003-12-14 10 10
15 2003 December 15 2003-12-15 10 10
16 2003 December 16 2003-12-16 10 10
17 2003 December 17 2003-12-17 10 10
18 2003 December 18 2003-12-18 10 10
19 2003 December 19 2003-12-19 10 10
20 2003 December 20 2003-12-20 10 10
21 2003 December 21 2003-12-21 10 10
22 2003 December 22 2003-12-22 10 10
23 2003 December 23 2003-12-23 10 10
24 2003 December 24 2003-12-24 10 10
25 2003 December 25 2003-12-25 10 10
26 2003 December 26 2003-12-26 10 10
27 2003 December 27 2003-12-27 10 10
28 2003 December 28 2003-12-28 10 10
29 2003 December 29 2003-12-29 10 10
30 2003 December 30 2003-12-30 10 10
31 2003 December 31 2003-12-31 10 10
32 2004 January 1 2004-01-01 10 10
33 2004 January 2 2004-01-02 10 10
34 2004 January 3 2004-01-03 10 10
35 2004 January 4 2004-01-04 10 10
36 2004 January 5 2004-01-05 10 10
37 2004 January 6 2004-01-06 10 10
38 2004 January 7 2004-01-07 10 10
39 2004 January 8 2004-01-08 10 10
40 2004 January 9 2004-01-09 10 10
41 2004 January 10 2004-01-10 10 10
42 2004 January 11 2004-01-11 10 10
43 2004 January 12 2004-01-12 10 10
44 2004 January 13 2004-01-13 10 10
45 2004 January 14 2004-01-14 10 10
46 2004 January 15 2004-01-15 10 10
47 2004 January 16 2004-01-16 10 10
48 2004 January 17 2004-01-17 10 10
49 2004 January 18 2004-01-18 10 10
50 2004 January 19 2004-01-19 10 10
51 2004 January 20 2004-01-20 10 10
52 2004 January 21 2004-01-21 10 10
53 2004 January 22 2004-01-22 10 10
54 2004 January 23 2004-01-23 10 10
55 2004 January 24 2004-01-24 10 10
56 2004 January 25 2004-01-25 5 4
57 2004 January 26 2004-01-26 10 10
58 2004 January 27 2004-01-27 10 10
59 2004 January 28 2004-01-28 10 10
60 2004 January 29 2004-01-29 10 10
61 2004 January 30 2004-01-30 10 10
62 2004 January 31 2004-01-31 10 10
63 2004 February 1 2004-02-01 10 10
64 2004 February 2 2004-02-02 5 4
65 2004 February 3 2004-02-03 10 10
66 2004 February 4 2004-02-04 10 10
67 2004 February 5 2004-02-05 10 10
68 2004 February 6 2004-02-06 10 10
69 2004 February 7 2004-02-07 10 10
70 2004 February 8 2004-02-08 10 10
71 2004 February 9 2004-02-09 7 6
72 2004 February 10 2004-02-10 10 10
73 2004 February 11 2004-02-11 10 10
74 2004 February 12 2004-02-12 10 10
75 2004 February 13 2004-02-13 10 10
76 2004 February 14 2004-02-14 10 10
77 2004 February 15 2004-02-15 10 10
78 2004 February 16 2004-02-16 10 10
79 2004 February 17 2004-02-17 10 10
80 2004 February 18 2004-02-18 10 10
81 2004 February 19 2004-02-19 10 10
82 2004 February 20 2004-02-20 10 10
83 2004 February 21 2004-02-21 10 10
84 2004 February 22 2004-02-22 10 10
85 2004 February 23 2004-02-23 10 10
86 2004 February 24 2004-02-24 10 10
87 2004 February 25 2004-02-25 10 10
88 2004 February 26 2004-02-26 10 10
89 2004 February 27 2004-02-27 10 10
90 2004 February 28 2004-02-28 10 10
91 2004 February 29 2004-02-29 10 10

我想做的几乎是aggregate()所做的
min <- aggregate(Data[5:6], by= list(Data$Months, Data$Years), FUN = min)


Group.1 Group.2 A B
December 2003 3 4
January 2004 5 4
February 2004 5 4

但是,要在 2 月获得与前几个月的最小值相距至少 10 天的每个 A 和 B 的最小值。

所以我想得到:
Group.1     Group.2 A   B
December 2003 3 4
January 2004 5 4
February 2004 7 6

有任何想法吗?

最佳答案

好吧,如果您有兴趣,我有一个凌乱的解决方案:)

首先,让我们确保月份正确排序并为月份/年份组合创建一个因子

data$Months<-factor(data$Months, levels=month.name)
data$MY<-interaction(data$Months, data$Years, drop=T)

现在我将定义一些辅助函数
getpaddoff<-function(n) {
function(x) {
a<-which.min(x)+n-length(x);
ifelse(a>0,a,0)
}
}
rollright<-function(x, add=0) {
n<-names(x)
x<-head(c(add,x), -1)
names(x)<-n;
x
}
getpadoff函数将返回下个月有多少所需的非重叠天数。和 rollright将允许我将返回从一个月转移到下一个月。 getpadoff正如所写的那样,它要求每个月的每一天在数据中都有一个条目。

好的,现在我们开始将这些应用于数据。我们得到一个函数来确保 10 天的间隔。然后我们根据月/年拆分数据。然后我们计算我们必须从每个月移除的天数,因为最小值太接近上个月的月底了。
paddoff <- getpaddoff(10)
ss <- split(data[c("A","B")], data$MY)
offsets <- rollright(lapply(ss, function(x) sapply(x, padoff)),
add=list(c(A=0, B=0)))

一旦我们有了这些值,我们就可以找到每个月的非重叠最小值。
rr<-Map(function(d,off) {
d<-as.matrix(d)
stopifnot(ncol(d)==length(off))
for(i in seq_along(off)) {
if(off[i]>0)
d[1:off[i],i]<-Inf
}
apply(d,2,min)
}, ss, offsets)
do.call(rbind,rr)

这是结果
              A B
December.2003 3 4
January.2004 5 4
February.2004 7 6

我不确定您究竟需要如何格式化结果,但这至少可以提取您想要的值。

关于r - 如何返回相隔至少 10 天的每年的每月最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24002413/

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