gpt4 book ai didi

r - 提高 R 中 ifelse-for 循环的速度,同时在循环内填充矩阵

转载 作者:行者123 更新时间:2023-12-01 23:37:36 25 4
gpt4 key购买 nike

如果实际循环范围是 1000 次,我怎样才能提高以下循环操作的速度?在下面的代码中:

DF3=数据框

OP 和 k 是 DF3 数据框中的两列。此处,k 的取值范围为 1 到 10。

l1 <- seq(1, 10, 1)
E<-matrix(data=0, nrow=10, ncol=10)
for (i in seq_along(l1)){
for (j in seq_along(l1)){
E[i,j]=sum(ifelse (DF3$OP[DF3$k==i]<DF3$OP[DF3$k==j],1,0))
}
}

DF3 示例:

k   OP
1 60
1 30
1 38
1 46
2 29
2 35
2 13
2 82
3 100
3 72
3 63
3 45

最佳答案

也许你可以通过使用 combn 来简化嵌套的 for 循环,它只计算上三角矩阵的值(但它们足以获得整个中的值矩阵)

E <- matrix(data = 0, nrow = max(DF3$k), ncol = max(DF3$k))
v <- split(DF3$OP, DF3$k)
E[lower.tri(E)] <- combn(v, 2, FUN = function(x) sum(do.call("-", x) < 0))
E[upper.tri(E)] <- max(lengths(v)) - t(E)[upper.tri(E)]
E <- t(E)

最后你会得到

> E
[,1] [,2] [,3]
[1,] 0 2 3
[2,] 2 0 3
[3,] 1 1 0

数据

> dput(DF3)
structure(list(k = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L,
3L, 3L), OP = c(60L, 30L, 38L, 46L, 29L, 35L, 13L, 82L, 100L,
72L, 63L, 45L)), class = "data.frame", row.names = c(NA, -12L
))

关于r - 提高 R 中 ifelse-for 循环的速度,同时在循环内填充矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65365316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com