3

我有一个大型数据框(800 个变量的 40000 个观察值),并希望使用类似于点积的东西对每个观察值的一系列列进行操作。这就是我实现它的方式:

matrixattempt <- as.matrix(dframe)
takerow <- function(k) {as.vector(matrixattempt[k,])}
takedot0 <- function(k) {sqrt(sum(data0averrow * takerow(k)[2:785]))}

for (k in 1:40000){
print(k)
dframe$dot0aver[k]<-takedot0(k)
}

打印只是为了跟踪正在发生的事情。 data0averrow是一个数字向量,与takerow(k)[2:785]大小相同,已预先定义。

这是正在运行的,并且从一些测试中可以正确运行,但是速度很慢。

我搜索了列子集的点积,发现了这个问题,但不知道如何将它应用到我的设置中。ddply 听起来它应该工作得更快(尽管我不想进行拆分,并且必须使用与引用的提问者相同的定义 ID 技巧)。任何见解/提示?

4

2 回答 2

3

尝试这个:

sqrt(colSums(t(matrixattempt[, 2:785])  * data0averrow))

或等效地:

sqrt(matrixattempt[, 2:785] %*% data0averrow)
于 2013-06-16T06:26:52.590 回答
2

对结果使用矩阵乘法和 rowSums:

dframe$dot0aver <- NA
dframe$dot0aver[2:785] <- sqrt( rowSums( 
                              matrixattempt[2:785,] %*% data0averrow ))

data0aver它是范围内每一行的点积的 sqrt

于 2013-06-16T06:19:19.003 回答