R应用累计金额

时间:2014-08-06 14:32:01

标签: r apply cumsum

我最近问了一个问题,这个问题让我朝着正确的方向前进,但给我留下了一些unsolved issues

我有一个data.frame,最后一行(RBH)中列出了最终增长测量值。每个样本都在一个单独的列中,并且具有不同的观察结束年份(2010年,2011年或2012年)。基本上,我需要通过测量将最终总增长测量值(RBH值)应用到去年,然后从当前增长测量值中减去前一年的每年增长测量值,以重建每年样本的大小。

上一个问题中给出的解决方案允许我创建累加和以从每个测量中减去,但是它不会适当地处理NA或NaN值。如果给定样本具有以下测量值,则输出应如下:

样本测量:

2009 - 1.2    
2010 - 1.8    
2011 - NaN    
2012 - NaN    
RBH - 60.5   

预期输出:

2008 - 57.5    
2009 - 58.7    
2010 - 60.5    
2011 - NaN    
2012 - NaN  

我一直在使用的代码是由另一个用户建议的如下:

cumsum.alt <- function(x){    
  res <- NaN*seq(x)    
  for(i in seq(x)){    
    if(sum(is.na(x[1])) == i){    
      res[i] <- NaN    
    } else {    
      res[i] <- sum(x[1:i], na.rm=TRUE)    
    }    
  }    
  res    
}    

df1[is.na(df1)] = 0 ##This is how you're actually treating it!    
df1 = data.frame(df1)    
df2 = apply(df1[nrow(df1):1,], 2, function(x) c(x[1], x[1]-cumsum.alt(x[-1])))    
df2 = df2[nrow(df2):1,] 

这适用于累积和,但不处理NA值。任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

取代NaN / NAs会有帮助吗?尝试用零替换它们:

x[!is.finite(x)] <- 0
cumsum(x)