【问题标题】:Arranging a list of vectors according to the sum of square of each element根据每个元素的平方和排列向量列表
【发布时间】:2026-01-28 21:20:13
【问题描述】:
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 &lt; 5 &lt; 17,所需的输出将是:

   vectors   squaresum
    c(1,1)    2

    c(1,2)    5

    c(1,4)    17

我正在考虑为平方和构建一个函数。然后使用该函数对向量进行排序。但无法正常进行。如有任何帮助,我们将不胜感激。

【问题讨论】:

    标签: r list sorting


    【解决方案1】:

    您可以遍历列表以计算每个向量的平方和,并使用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
      

      【讨论】:

        最近更新 更多