将函数应用于矩阵中元素的向量(子集行?)
Applying a function to vectors (subseted row?) of elementes in a matrix
如果我有这样的矩阵
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]
将是这样的:
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 个元素的集合。希望我清楚。
谢谢
我在每一行上创建了一个循环函数来计算每组三个元素的系数。
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
zoo
中有一个 rollapply
函数似乎可以满足您的需求。
library(zoo)
rr <- t(rollapply(t(x), by.column=TRUE, width=3,
FUN=function(z) coef(lm(z ~ c(1,2,3)))[2]))
好像里面可能有一个额外的转置,但我不知道如何去掉它...
如果我有这样的矩阵
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]
将是这样的:
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 个元素的集合。希望我清楚。
谢谢
我在每一行上创建了一个循环函数来计算每组三个元素的系数。
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
zoo
中有一个 rollapply
函数似乎可以满足您的需求。
library(zoo)
rr <- t(rollapply(t(x), by.column=TRUE, width=3,
FUN=function(z) coef(lm(z ~ c(1,2,3)))[2]))
好像里面可能有一个额外的转置,但我不知道如何去掉它...