在另一列的数据框架中构建库存变量

时间:2016-11-17 12:20:14

标签: r time-series dplyr data-manipulation stock

我正在寻找一种方便快捷的方法来构建一个新的列,其中的库存变量取决于之前对新列的观察以及旧列中的值。

所以B列应该是ColumnBt = 0.01 * Bt-1 + ColumnAt

数据看起来应该导致

ColumnA      ColumnB
1            1
0            0.01
0            0.0001
4            4.000001
5            5.04000001
0            0.504

在某些时候,能够将因子(0.01)确定为交替结转的变量甚至会很方便。

如何轻松实现这一目标?

非常感谢任何帮助或建议!非常感谢!

1 个答案:

答案 0 :(得分:2)

关键是为差分方程建立一个合适的单位响应矩阵 ColumnB[k] = 0.01 * ColumnB[k-1] + ColumnA[k]

> z
      [,1]  [,2]  [,3]  [,4] [,5] [,6]
[1,] 1e+00 0e+00 0e+00 0e+00 0.00    0
[2,] 1e-02 1e+00 0e+00 0e+00 0.00    0
[3,] 1e-04 1e-02 1e+00 0e+00 0.00    0
[4,] 1e-06 1e-04 1e-02 1e+00 0.00    0
[5,] 1e-08 1e-06 1e-04 1e-02 1.00    0
[6,] 1e-10 1e-08 1e-06 1e-04 0.01    1

然后,通过叠加ColumnB <- z %*% ColumnA。构建这个矩阵:

lag <- 0.01  ## This is your parameter
r <- lag^(seq_len(length(ColumnA))-1)
m <- matrix(rep(r,length(ColumnA)),nrow=length(ColumnA))

z <- matrix(0,nrow=length(ColumnA),ncol=length(ColumnA))
z[lower.tri(z,diag=TRUE)] <- m[row(m) <= (length(ColumnA)+1-col(m))]
##      [,1]  [,2]  [,3]  [,4] [,5] [,6]
##[1,] 1e+00 0e+00 0e+00 0e+00 0.00    0
##[2,] 1e-02 1e+00 0e+00 0e+00 0.00    0
##[3,] 1e-04 1e-02 1e+00 0e+00 0.00    0
##[4,] 1e-06 1e-04 1e-02 1e+00 0.00    0
##[5,] 1e-08 1e-06 1e-04 1e-02 1.00    0
##[6,] 1e-10 1e-08 1e-06 1e-04 0.01    1

我们可以把它放到一个函数中:

constructZ <- function(lag, N) {
  r <- lag^(seq_len(N)-1)
  m <- matrix(rep(r,N),nrow=N)
  z <- matrix(0,nrow=N,ncol=N)
  z[lower.tri(z,diag=TRUE)] <- m[row(m) <= (N+1-col(m))]
  z
}

然后,

df <- data.frame(ColumnA=c(1,0,0,4,5,0))
df$ColumnB <- constructZ(0.01,nrow(df)) %*% df$ColumnA
print(df)
##  ColumnA  ColumnB
##1       1 1.000000
##2       0 0.010000
##3       0 0.000100
##4       4 4.000001
##5       5 5.040000
##6       0 0.050400

更新了每个指标值应用函数的答案

假设你有数据:

df <- structure(list(ColumnA = c(1L, 0L, 0L, 4L, 5L, 0L, 4L, 0L, 2L
), Indicator = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), Time = c(1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L)), .Names = c("ColumnA", "Indicator", 
"Time"), class = "data.frame", row.names = c(NA, -9L))
##  ColumnA Indicator Time
##1       1         1    1
##2       0         1    2
##3       0         1    3
##4       4         2    1
##5       5         2    2
##6       0         2    3
##7       4         3    1
##8       0         3    2
##9       2         3    3

您希望为ColumnA分别计算Time(对所有Indicator)所有观察值的响应。然后,您可以使用constructZ

执行以下操作
df$ColumnB <- unlist(by(df,df$Indicator,function(df) constructZ(0.5,nrow(df)) %*% df$ColumnA))

在这里,我们使用by分别计算由df值拆分的数据框Indicator上提供的函数。与之前滞后参数为constructZ(0.5,nrow(df)) %*% df$ColumnA)的函数一样,提供的函数只是0.5by的输出是一个列表,我们unlist然后设置为df$ColumnB。结果如预期:

print(df)
##  ColumnA Indicator Time ColumnB
##1       1         1    1    1.00
##2       0         1    2    0.50
##3       0         1    3    0.25
##4       4         2    1    4.00
##5       5         2    2    7.00
##6       0         2    3    3.50
##7       4         3    1    4.00
##8       0         3    2    2.00
##9       2         3    3    3.00