将函数应用于矩阵中的元素的向量(子对象行?)

时间:2015-09-14 20:16:39

标签: r apply

如果我有一个矩阵,如

x<-matrix(rnorm(30), nrow=5, ncol=6)
x

           [,1]       [,2]       [,3]       [,4]        [,5]       [,6]
[1,] -2.6564554 -0.1719174 -1.7631631  1.0351035 -0.85090759  0.7581632
[2,] -2.4404669  1.2146747  0.4600974 -0.6089264 -2.41420765 -0.7267048
[3,]  1.3201133  1.8951935 -0.6399949  0.5049551  0.03612261 -1.3682810
[4,] -0.3066386 -0.4304691  0.4554501 -1.7170087  0.20599860  0.4328180
[5,] -1.7813084 -0.2572694  0.7048373 -0.7844590 -0.36105730 -0.8113932

我想生成一个矩阵Y,其中包含每行中每组3个数据点的斜率,因此我的新矩阵的元素Y[1,1]Y[1,2]将是这样的:< / p>

Y[1,1]=lm(x[1,1:3]~c(1,2,3))$coefficient[2]
Y[1,2]=lm(x[1,2:4]~c(1,2,3))$coefficient[2]

我知道如何使用for来做这件事,这对于小数据来说是好的,但是在数百万行的数据集上执行它几乎是不可能的。我对apply()函数的问题在于我知道如何在数据集的每个行,列或单个元素上应用函数,但不知道如何在3个元素的集合上应用函数。希望我清楚。 感谢

2 个答案:

答案 0 :(得分:1)

我在每一行上创建了一个循环函数来计算每组三个元素的系数。

mylm = function (x) {
  v=vector("numeric", length(x)-2)
  for (i in 1:(length(x)-2)) {
    v[i]=lm(x[i:(i+2)]~c(1,2,3))$coefficient[2]
  }
  v
}
Y = t(apply(x, 1, FUN=mylm))
Y
          [,1]       [,2]      [,3]       [,4]
[1,]  0.2655043 -0.3789681 0.2305446 -0.8279703
[2,] -0.1925491 -0.4061229 0.3647903 -0.1093176

答案 1 :(得分:1)

来自rollapply的{​​{1}}功能似乎可以满足您的需求。

zoo

似乎可能会有一个额外的转置,但我无法弄清楚如何摆脱它...