首页 > 解决方案 > 如何为我的整个表集向前滚动最大值?

问题描述

所以我有一个名为 aaa 的数据集,如下所示:

Date      100.sh 101.sh 102.sh 100.sz 101.sz 102.sz ... xxx.xx 
2009 Q1      1      1      0      0     0      NA          ...
2009 Q2      0      0      1      0     0      NA          ...
2009 Q3      0      0      1      NA    0      NA          ...
2009 Q4      0      0      0      1     0      NA          ...
2010 Q1      1      0      1      0     0      NA          ...
2010 Q2.     0      0      0      0     0       1          ...
...
2020 Q3      0      0      0      1     0       0          ...

我的目标是更改此表,看看在接下来的四个季度中,当前季度是否有任何 1 或 0 或 NA。所以基本上我试图找到接下来四个季度(不包括当前季度)的滚动最大值,所以如果例如在接下来的四个季度(2009 Q2-2010 Q2)的 2009 Q1 的 100.sh 有任何 1那么它将是 1,如果接下来的四个季度只有 0,那么它将为零,如果接下来的四个季度都是 NA,那么 NA。这就是我使用 rollmax 的原因,因为无论如何最大值都是 1。

以下是我尝试过的一些方法:

aaaa<-rollmax(aaa[-1], 4, align="left", na.rm-TRUE, partial=TRUE, fill=0)

但它给了我错误:与请求的类型不兼容:[type=list:target=double]

所以我尝试了:

aaaa<-rollmax(aaa[-1], 4, align="left", na.rm=TRUE, partial=TRUE, fill=0)

但这给了我 match.arg(align) 中的错误:'arg' 应该是“正确”之一

aaaa<-rollapplyr(aaa[-1],4,max, align="left", na.rm=TRUE, partial=TRUE, fill=0)

但是,这只是删除了日期并给了我一串数字。

我也试过:

aaaa<-rollmaxr(aaa, 4,align="left", na.rm=TRUE, partial=TRUE, fill=0)

这也给了我一个带有日期的 num 字符串。

然后我尝试了:

  aaa[roll_max(aaa,4)]

但这也给了我错误:与请求的类型不兼容:[type=list:target=double]

我想保持日期相同,而不是在日期上滚动,同时将其保留为 data.frame,因此结果如下所示:

Date      100.sh 101.sh 102.sh 100.sz 101.sz 102.sz ... xxx.xx 
2009 Q1      1      0      1      1     0      NA          ...
2009 Q2      1      0      1      1     0       1          ...
2009 Q3      1      0      1      1     0       1          ...
2009 Q4      1      0      1      0     0       1          ...
2010 Q1      0      0      1      0     0       1          ...
2010 Q2             depends on next four quarter           ...
...  
2020 Q3      0      0      0      0     0       0          ...

(在上面的表格中,2009 年第二季度及以后的一些 0 和 1 确实取决于接下来四个季度的列表,如果我只是假设有 1,但这是我希望表格看起来像什么的粗略想法,抱歉! )

有没有办法保持日期相同并找到未来四个季度的向前滚动最大值,如果有任何 1 然后 1,case_when ~1 ~0 ~NA或者使用if&any会是更好的方法吗?

感谢你的帮助!

标签: r

解决方案


我可以建议一种不同的方法。您的数据是二进制的(1 和 0)。因此,您可以利用用于逻辑运算(TRUE 和 FALSE)的函数。一个真正有用的函数是any()。如果一组数字中1有任何数字,则返回。1它应该比 rollmax 更快、更简单。

有了它,您可以构建一个适用于单列的函数:

rollany <- function(x) {
   nx <- length(x)
   result <- numeric(length=nx)
   for(i in 1:(nx-5)) { result[i] <- any(x[(i+1):(i+5)]) }
   return(result)
}

接下来,您可以使用 apply 为每一列运行该函数

apply(aaa,2,rollany)

推荐阅读