【问题标题】:R-Operating on subset of columns from dataframe with ddply使用 ddply 对数据帧中的列子集进行 R 操作
【发布时间】:2013-06-16 04:45:20
【问题描述】:

我有一个大型数据框(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] 大小相同。

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

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

【问题讨论】:

  • 如果这些答案都不起作用,你真的需要用一个小测试用例来解决这个问题,比如一个 8 x 10 矩阵?
  • @Arun 的回复效果很好。谢谢。

标签: r dataframe plyr dot-product


【解决方案1】:

试试这个:

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

或等效:

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

【讨论】:

  • 这两个都运行得非常快。谢谢你。在编写 for 循环之前,我曾尝试使用 %*% 行,但顺序颠倒了(或者我设置它的方式有其他问题),因此每行都给了我相同的值。
【解决方案2】:

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

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

它是data0aver 与范围内每一行的点积的平方

【讨论】:

  • 不确定,但我认为 RHS 必须是 matrixattempt[, 2:785] %*% ...?而且我认为您不需要rowSums
  • 也不确定。我以为他希望行 2:785 乘以与列数相同长度的向量。我编辑了我的答案以反映自从我第一次尝试时出现一两个错误
  • 啊现在我明白你的意思了,为什么你需要rowSums。但我看到的是:对于每个 k,将 matrixattemptkth 行与 2:785 列相乘,然后乘以 data0averrow
猜你喜欢
  • 2012-10-24
  • 2015-12-13
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
  • 2015-06-20
  • 2020-10-13
相关资源
最近更新 更多