【发布时间】:2020-02-07 21:31:21
【问题描述】:
我有一个名为“dahak”的列表,其中包含 1 到 10 之间的 30000 个数字。我想用列表中的所有数字检查每个数字,如果两个数字相等,则将数字 1 附加到 weight_list,如果两个数字不等于然后计算它们的差并将其存储为 x 并将 x 附加到 weight_list。 代码如下:
for(j in 1:num_nodes){
for (k in 1:num_nodes){
if(j==k){
weight_list <- c(weight_list,0)
}
else if(as.numeric(dahak[j])==as.numeric(dahak[k])){
weight_list <- c(weight_list,1)
}
else if(as.numeric(dahak[j])!=as.numeric(dahak[k])){
x = 1 - (abs(as.numeric(dahak[j]) - as.numeric(dahak[k])) / 10)
weight_list <- c(weight_list,x)
}
}
}
如何优化这段代码?我怎么能用 lapply 做到这一点?
【问题讨论】:
-
请展示一个可重现的小例子,以便其他人可以测试
-
如果没有可重现的例子就不清楚了。可能是
v1 <- unlist(dahak); outer(v1, v1, FUN = '==') -
什么是
num_nodes?另外,第二个if语句应该是else if吗?正如示例中所写,如果j==k和dahak[j]==dahak[k],weight_list将在同一迭代中同时附加0和1。 -
@akrun dahak 列表是这样的:[1,1,2,6,4,3,3,3,2,3,1,2,] ...我的代码没有错误,但是运行需要很长时间...我使用 wight_list 创建矩阵,然后使用矩阵创建网络...如果您想要所有代码,我可以将其发送给您
-
您已经问过如何优化您的代码,因为它需要很长时间才能运行。除了下面的Allan's answer,这里还有 3 个提示: (1) 在循环中增长向量非常耗时,因为数据会一遍又一遍地复制。更好地预先分配一个向量并通过子集更新单个元素。 (2) 最后两个
if子句是不必要的,因为如果dahak[j] == dahak[k]无论如何你的公式都会返回1(3) 将dahak的强制从循环中拉出,而不是对循环中的单个元素重复此操作.
标签: r nested-loops lapply