当我第二次调用该函数时,为什么我的列会重复?

时间:2015-01-21 19:23:55

标签: r

我正在使用此功能创建时间序列的n天累积。

masterfunction <-function(df,accum_var,accum_days){
  df<-cbind(df,rollapply(df[[accum_var]], accum_days, sum, fill=NA, align='right'))
}
odd<-masterfunction(df=odd,accum_var = "PRECIP",accum_days = 4)
odd<-masterfunction(df=odd,accum_var = "OBS_Q",accum_days = 2)

但是当我第二次运行它(对于OBS_Q)时,第一列(对于PRECIP)会重复。有什么指示我怎么解决这个问题?另外,任何建议,如果我可以改进这个代码,我可以给函数一个变量列表(accum_var),而不是一次又一次地调用它?

    odd<-structure(list(DATE = 19630101:19630106, PRECIP = c(0, 0, 0, 
0, 0, 0.04), OBS_Q = c(1.61, 1.48, 1.4, 1.33, 1.28, 1.27), swb = c(1.75, 
1.73, 1.7, 1.67, 1.65, 1.63), gr4j = c(1.9, 1.77, 1.67, 1.58, 
1.51, 1.44), isba = c(0.83, 0.83, 0.83, 0.83, 0.83, 0.83), noah = c(1.31, 
1.19, 1.24, 1.31, 1.44, 1.55), sac = c(1.99, 1.8, 1.66, 1.57, 
1.46, 1.41), swap = c(1.1, 1.05, 1.08, 0.99, 0.88, 0.83), vic.mm.day. = c(2.1, 
1.75, 1.55, 1.43, 1.32, 1.17)), .Names = c("DATE", "PRECIP", 
"OBS_Q", "swb", "gr4j", "isba", "noah", "sac", "swap", "vic.mm.day."
), row.names = 366:371, class = "data.frame")

谢谢!

1 个答案:

答案 0 :(得分:1)

这应该可以解决问题。

执行与masterfunction

相同操作的新功能
masterfunction2 <-function(accum_var, df = odd, suffix = "_new") {
  j <- data.frame(rollapply(data = df[, accum_var[1]],
                            width = as.numeric(accum_var[2]),
                            FUN = sum, fill=NA,
                            align='right'))
  names(j) = paste0(accum_var[1], suffix)
  return(j) }  

使用列表作为输入,列名称后跟width参数

i = list(c("PRECIP", 4),
         c("PRECIP", 2), 
         c("OBS_Q", 2), 
         c("noah", 3))

获取输出。使用suffix更改新列名称。 df更改您的data.table名称。

cbind(odd, do.call(cbind, sapply(X = i, FUN = masterfunction2, df = odd, suffix = "_roll")))

        DATE PRECIP OBS_Q  swb gr4j isba noah  sac swap vic.mm.day. PRECIP_roll OBS_Q_roll noah_roll
366 19630101   0.00  1.61 1.75 1.90 0.83 1.31 1.99 1.10        2.10          NA         NA        NA
367 19630102   0.00  1.48 1.73 1.77 0.83 1.19 1.80 1.05        1.75          NA       3.09        NA
368 19630103   0.00  1.40 1.70 1.67 0.83 1.24 1.66 1.08        1.55          NA       2.88      3.74
369 19630104   0.00  1.33 1.67 1.58 0.83 1.31 1.57 0.99        1.43        0.00       2.73      3.74
370 19630105   0.00  1.28 1.65 1.51 0.83 1.44 1.46 0.88        1.32        0.00       2.61      3.99
371 19630106   0.04  1.27 1.63 1.44 0.83 1.55 1.41 0.83        1.17        0.04       2.55      4.30