【发布时间】:2015-09-10 04:18:56
【问题描述】:
我编写了一个循环来有条件地替换列表列表中的元素。虽然对 R 来说还是比较新的,但我确信我不会尽可能高效地处理这个问题。以下循环在我的实际数据上运行非常缓慢(一个小时左右)。我在下面包含了一个最小的工作示例,它完全复制了我的数据结构。
A <- matrix(c(0, 1, 1, 2, 0, 0, 1, 0, 1, 2, 0, 0), nrow = 2, ncol = 6, byrow = TRUE)
B <- matrix(c(1, 1, 1, 2, 0, 1, 1, 0, 1, 2, 0, 0), nrow = 2, ncol = 6, byrow = TRUE)
C <- matrix(c(1, 0, 0, 1, 0, 1), nrow = 1, ncol = 6, byrow = TRUE)
D <- matrix(c(0, 0, 0, 1, 1, 1), nrow = 1, ncol = 6, byrow = TRUE)
mList <-list(list(A, B))
dList <- list(list(C, D))
如果dList 的第n 项的元素j 等于0,则循环的目标是用0 替换mList2 的第n 项的第j 列中的所有单元格。
mList
# [[1]]
# [[1]][[1]]
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] 0 1 1 2 0 0
# [2,] 1 0 1 2 0 0
#
# [[1]][[2]]
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] 1 1 1 2 0 1
# [2,] 1 0 1 2 0 0
dList
# [[1]]
# [[1]][[1]]
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] 1 0 0 1 0 1
#
# [[1]][[2]]
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] 0 0 0 1 1 1
这是使用apply 函数集的另一个未实现收益的实例吗?有没有更好的不涉及使用四个索引的方法?
for(i in 1:length(dList)) {
for(j in 1:length(dList[[i]])) {
for(k in 1:length(dList[[i]][[j]])) {
for(m in 1:nrow(mList[[i]][[j]])) {
mList[[i]][[j]][m, k] <-
ifelse(
dList[[i]][[j]][k] == 1,
mList[[i]][[j]][m, k],
0
)
}
}
}
}
导致:
mList
# [[1]]
# [[1]][[1]]
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] 0 0 0 2 0 0
# [2,] 1 0 0 2 0 0
# [[1]][[2]]
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] 0 0 0 2 0 1
# [2,] 0 0 0 2 0 0
【问题讨论】:
-
我想我可能知道您遇到速度问题的原因。首先,为什么你有嵌套列表?
-
第一层的每个列表都是一年,每一年都包含很多邻接矩阵。数据以这种方式组织,以便能够轻松访问特定年份和矩阵。现在我想了想,我可以取消列出外部列表并将年份合并到每个矩阵名称中。