【问题标题】:Rolling rowsums in unbalanced panel data in RR中不平衡面板数据中的滚动行和
【发布时间】:2017-08-29 16:38:35
【问题描述】:

我有不平衡的面板数据,并希望获取过去 36 个月中每个观察的行和 (MRAR),如列(时间序列“日期”)中报告的那样:

dput(ER)

NA, NA, NA, NA, NA, NA, NA, -4.91111111111111, NA, NA, -6, 
NA, NA, NA, -1.31111111111111, NA, NA, NA, -5.95555555555556, 
-5.73333333333333, -5.75555555555556, -5.86666666666667, 
-5.33333333333333, -5.35555555555556, NA, -5.22222222222222, 
-5.17777777777778, -5.28888888888889, -5.26666666666667)), 
.Names = c("ER.08.2007", "ER.09.2007", "ER.10.2007", "ER.11.2007", "ER.12.2007", "ER.01.2008", 
"ER.02.2008", "ER.03.2008", "ER.04.2008", "ER.05.2008", "ER.06.2008", 
"ER.07.2008", "ER.08.2008", "ER.09.2008", "ER.10.2008", "ER.11.2008", row.names = c(NA, 
-3530L), class = "data.frame")

str(ER)
'data.frame':   3530 obs. of  120 variables:
 $ ER.08.2007: num  NA NA NA NA NA NA NA NA NA NA ...
 $ ER.09.2007: num  NA NA NA NA NA NA NA NA NA NA ...
 $ ER.10.2007: num  NA NA NA NA NA NA NA NA NA NA ...

我尝试了以下方法:

MRAR_3y <- as.data.frame(mat.or.vec(nrow(ER), length(dates)))

for (i in seq(1,length(dates)-36))
{
  MRAR_3y[,i] <- rowSums(ER[,c(seq(i,(i+35)))], na.rm=FALSE)
}

所需的 MRAR_3y 数据框给出了过去 36 个月的 ER 的总和但是,上面的代码返回以下内容:

> str(MRAR_3y)
'data.frame':   3530 obs. of  120 variables:
 $ V1  : num  NA NA NA NA NA NA NA NA NA NA ...
 $ V2  : num  NA NA NA NA NA NA NA NA NA NA ...
 $ V59 : num  NA NA NA NA NA NA NA NA NA NA ...
 $ V60 : num  NA NA NA NA NA NA NA NA NA NA ...
 $ V61 : num  NA NA NA NA -53.9 ...
 $ V62 : num  NA NA NA NA -55.6 ...
 $ V63 : num  NA NA NA NA -53.9 ...
 $ V64 : num  NA NA NA NA -53.7 ...

因此,甚至在前 36 个日期列之前就有一些值。如果我查看(MRAR_3y),则 df 中有一些“inf”条目。

这个问题与围绕滚动和的几个线程有关,即R dplyr rolling sum

帮助非常感谢, 威廉幻想

【问题讨论】:

  • 你能粘贴一个完整的dput吗?开头被切断了
  • 嗨,迈克,数据集非常大,因此完整的 dput 不适合此模板...
  • dput(head(er)) dput(head(er[, 1:10])) 怎么样?

标签: r for-loop rowsum


【解决方案1】:

你可以看看zoorollsum,使用安德鲁的样本数据

x <- sample(10,100,replace=TRUE)
zoo:rollsum(x,36)

181 181 179 180 180 182 184 183 181 182 187 189 192 191 187 196 200 201 

【讨论】:

    【解决方案2】:

    一种简单的方法是对累积和进行差分。这是一个示例,但您需要根据您的数据对其进行调整。

    x <- sample(10,100,replace=TRUE)
    
    L <- length(x)
    W <- 36
    
    cumsum(x)[-c(1:W)] - cumsum(x)[-c((L-W+1):L)]   
    
    [1] 181 181 179 187 186 182 176 173 181 173 167 170 175 174 175 181 180 184 186... etc
    

    【讨论】:

      猜你喜欢
      • 2019-06-18
      • 2021-03-04
      • 1970-01-01
      • 2020-06-07
      • 2013-12-29
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多