x <- list(c(1,2), c(1,4), c(1,1))
我想根据每个向量元素的平方和来排列列表的向量。
三个向量的平方和:
1^2 + 2^2 = 5,
1^2 + 4^2 = 17,
1^2 + 1^2 = 2.
因为2 < 5 < 17
,所需的输出将是:
vectors squaresum
c(1,1) 2
c(1,2) 5
c(1,4) 17
我正在考虑为平方和建立一个函数。然后使用该函数对向量进行排序。但是做得不好。任何帮助都会得到满足。
答案 0 :(得分:3)
您可以遍历列表以计算每个向量的平方和,并使用order()
以升序获取值的索引。然后,您可以使用它们对初始列表x
进行排序:
x[order(sapply(x, function(v) sum(v ** 2)))]
结果是:
[[1]]
[1] 1 1
[[2]]
[1] 1 2
[[3]]
[1] 1 4
答案 1 :(得分:2)
如果列表向量的长度相同,则可以使用另一种方法:
x[order(rowSums(do.call(rbind, x)^2))]
[[1]]
[1] 1 1
[[2]]
[1] 1 2
[[3]]
[1] 1 4
然而,与@clemens相比,它看起来并没有在更大的列表上提供任何速度优势(我真的认为会这样):
x <- replicate(10000, sample(1:1000, 100, replace = TRUE), simplify = FALSE)
library(microbenchmark)
microbenchmark(clemens = x[order(sapply(x, function(v) sum(v ** 2)))],
missuse = x[order(rowSums(do.call(rbind, x) ^ 2))])
#output
Unit: milliseconds
expr min lq mean median uq max neval cld
clemens 32.03712 34.65821 59.16911 43.51531 57.19269 822.7295 100 a
missuse 32.84621 35.33422 47.53151 42.69733 56.09183 107.2334 100 a