arrays - R中的数组列表排序
问题描述
我有数组列表,我想选择最好的数组(最好的意思是那个数组中所有值的总和最小的数组)。
v1 = c(5,5,5,5)
v2 = c(6,6,6,6)
v3 = c(7,7,7,7)
v4 = c(8,8,8,8)
v5 = c(1,1,1,1)
v6 = c(2,2,2,2)
v7 = c(3,3,3,3)
v8 = c(4,4,4,4)
arr1 = array(c(v1,v2,v3,v4), dim = c(4,4))
arr2 = array(c(v5,v6,v7,v8), dim = c(4,4))
myList = list(arr1,arr2)
有什么功能可以做到吗?我需要在这样的循环中做到这一点:
solve <- function() {
A <- myList
while(length(A) != 0) {
X <- pickBestFrom(A)
if(isSolution(X)){
return(X)
break
}
Y <- neighbors(X)
A <- append(A,Y)
A <- unique(A)
}
}
您认为最好从我的列表中找到每次“最佳”值,还是先排序列表然后选择第一个元素?
解决方案
如果我上面的评论是正确的,即您需要一个pickBestFrom
函数,那么这里有两种选择,用代码对它们进行计时。
第一个对总和进行排序,然后选择最小的列表成员。
第二个选择使用较小的和which.min
并且速度更快。
pickBestFrom1 <- function(X){
X[[ order(sapply(X, sum))[1] ]]
}
pickBestFrom2 <- function(X){
X[[which.min(sapply(X, sum))]]
}
microbenchmark::microbenchmark(
order = pickBestFrom1(myList),
which.m = pickBestFrom2(myList),
times = 1e3
)
第二次测试,列表更大。which.min
仍然是最快的。
list2 <- lapply(1:1000, function(i) array(rnorm(16), dim = c(4, 4)))
microbenchmark::microbenchmark(
order = pickBestFrom1(list2),
which.m = pickBestFrom2(list2),
times = 1e3
)
推荐阅读
- javascript - How to display a string value on multiple lines in a paragraph that contains
as a new line character - javascript - Running code before and after each Method call in Meteor
- java - 带自动增量的 JDBC 插入
- kubernetes - k8s 集群上的 GlusterFS 部署——就绪探测失败:/usr/local/bin/status-probe.sh
- html - 将文本放在图像的左上角,百分比顶部和左侧偏移
- asp.net-core - 在 ASP.NET Core 中使用 ViewModel 将数据传递给 View
- javascript - 如何使用 for 循环向 JS 变量添加值?
- javascript - jstree回调加载和选择循环
- excel - 当行在日期范围之间时运行代码
- mysql - How to Use One General Table for Relationships