按照每个元素平方和排列向量列表

4
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

我在考虑编写一个计算平方和的函数,然后使用该函数对向量进行排序。但是我做不好。任何帮助将不胜感激。
2个回答

3

您可以遍历列表以计算每个向量的平方和,并使用order()获取升序值的索引。然后,您可以使用这些索引对初始列表x进行排序:

x[order(sapply(x, function(v) sum(v ** 2)))]

结果是:

[[1]]
[1] 1 1

[[2]]
[1] 1 2

[[3]]
[1] 1 4

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接