【问题标题】:Increase performance of R for-loops after pre-allocation of data structures在预分配数据结构后提高 R for 循环的性能
【发布时间】:2016-09-30 08:35:59
【问题描述】:

我读过一些关于在 r 中提高 for 循环性能的文章,但我仍然坚持使用大约 140 秒的循环。

我将从代码开始:

matrix <- matrix(NA, length(register[,1]), length(AK), dimnames = list(register[,1], AK))

data.cleaned <- data[data$FO %in% register[,1],]
rownames(data.cleaned) <- paste(1:nrow(data.cleaned))


for (i in 1 : nrow(data.cleaned)) {
  for (j in 1 : nrow(matrix)) {

    if (data.cleaned$FO[i] == rownames(matrix)[j]) {
        for (k in 1 : ncol(matrix)) {

              if (data.cleaned$AK[i] == colnames(matrix)[k])
                  {matrix[j,k] <- 1}

      }
    }  
  }
}

很遗憾,我无法提供任何可重现的示例。该 data.cleaned 数据帧是帧,其中包括大约 11000 行。在每一行中,对于 FO(主类别)和 AK(FO 的子类别)(两个不同的变量)都有一个观察值。

如果一行中有相应的 FO 和 AK 观测值,则目标是用 1 填充矩阵[i,j]。

这有意义吗。也请评论,如果我需要指定或可以以更清晰/更好的方式写帖子

【问题讨论】:

  • For 循环本身在 R 中的性能不是很好,尝试用矢量化函数等替换尽可能多的循环。
  • 我的答案中的代码需要多少秒才能处理您的数据?

标签: r performance for-loop


【解决方案1】:

第一步:
您可以设置

cnames.m <- colnames(matrix)

在进入循环之前。在正确的地方你可以做

if (data.cleaned$AK[i] == cnames.m[k]) matrix[j,k] <- 1

第二步:
内循环与

相同
matrix[j, data.cleaned$AK[i] == cnames.m] <- 1

因此无需循环使用k

matrix <- matrix(NA, length(register[,1]), length(AK), dimnames = list(register[,1], AK))

data.cleaned <- data[data$FO %in% register[,1],]
rownames(data.cleaned) <- paste(1:nrow(data.cleaned))

cnames.m <- colnames(matrix)
for (i in 1 : nrow(data.cleaned)) for (j in 1 : nrow(matrix)) 
    if (data.cleaned$FO[i] == rownames(matrix)[j]) matrix[j, data.cleaned$AK[i] == cnames.m] <- 1

关于对象名称的一点评论:
将矩阵命名为 matrix 不是一个好主意(你会命名一只狗 Dog 吗?)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    相关资源
    最近更新 更多