【问题标题】:R arrange list of vectorsR排列向量列表
【发布时间】:2021-10-11 08:29:26
【问题描述】:

假设我有一个这样的向量列表:

list.of.vec <- data.frame(id = c(1,2,3,4)) %>% 
  mutate(a = list(list(c(1,2,3), c(2,3,4)), list(c(2,4,5), c(1,3,4)), list(c(1,2,3), c(4,3,4)), list(c(3,2,3), c(2,3,4))))

我怎样才能安排 a 使得在每对向量中,具有较大第一个值的那个首先出现?例如,如果有一个列表 c(1,2,3), c(2,3,4),它应该变成 c(2,3,4), c(1,2,3)。如果第一个值相等,那么它会查看下一个值。

【问题讨论】:

    标签: r list sorting vector


    【解决方案1】:

    我们可以使用rrapply

    library(rrapply)
    library(purrr)
    library(dplyr)
    list.of.vec <- list.of.vec %>%
         mutate(a = map(a, ~ .x[order(-rrapply(.x, f = function(x) x[1], 
              how = 'unlist'))]))
    

    -输出

    > list.of.vec
      id                a
    1  1 2, 3, 4, 1, 2, 3
    2  2 2, 4, 5, 1, 3, 4
    3  3 4, 3, 4, 1, 2, 3
    4  4 3, 2, 3, 2, 3, 4
    
    > list.of.vec$a
    [[1]]
    [[1]][[1]]
    [1] 2 3 4
    
    [[1]][[2]]
    [1] 1 2 3
    
    
    [[2]]
    [[2]][[1]]
    [1] 2 4 5
    
    [[2]][[2]]
    [1] 1 3 4
    
    
    [[3]]
    [[3]][[1]]
    [1] 4 3 4
    
    [[3]][[2]]
    [1] 1 2 3
    
    
    [[4]]
    [[4]][[1]]
    [1] 3 2 3
    
    [[4]][[2]]
    [1] 2 3 4
    

    【讨论】:

      【解决方案2】:

      我们可以试试

      lapply(
        a,
        function(x) {
          x[order(-sapply(x, `[`, 1))]
        }
      )
      

      给了

      [[1]]
      [[1]][[1]]
      [1] 2 3 4
      
      [[1]][[2]]
      [1] 1 2 3
      
      
      [[2]]
      [[2]][[1]]
      [1] 2 4 5
      
      [[2]][[2]]
      [1] 1 3 4
      
      
      [[3]]
      [[3]][[1]]
      [1] 4 3 4
      
      [[3]][[2]]
      [1] 1 2 3
      
      
      [[4]]
      [[4]][[1]]
      [1] 3 2 3
      
      [[4]][[2]]
      [1] 2 3 4
      

      【讨论】:

        【解决方案3】:

        你可以使用 -

        list.of.vec$a <- lapply(list.of.vec$a, function(x) {
          inds <- match(TRUE, x[[1]] != x[[2]])
          if(x[[1]][inds] > x[[2]][inds]) x else rev(x)
        })
        
        list.of.vec$a
        
        #[[1]]
        #[[1]][[1]]
        #[1] 2 3 4
        
        #[[1]][[2]]
        #[1] 1 2 3
        
        
        #[[2]]
        #[[2]][[1]]
        #[1] 2 4 5
        
        #[[2]][[2]]
        #[1] 1 3 4
        
        
        #[[3]]
        #[[3]][[1]]
        #[1] 4 3 4
        
        #[[3]][[2]]
        #[1] 1 2 3
        
        
        #[[4]]
        #[[4]][[1]]
        #[1] 3 2 3
        
        #[[4]][[2]]
        #[1] 2 3 4
        

        inds 将返回我们需要比较的每个列表的索引,即两个向量中的值不同的索引。如果第一个索引具有更高的值,我们将返回列表原样而不做任何更改,否则我们返回反向列表。

        【讨论】:

        • 考虑到asplitapply 的多个边距,可能需要稍微解释一下。
        • 看起来这个解决方案重新排序值而不是向量。例如,在最后一个向量中,结果应该是 c(3,2,3), c(2,3,4),但它是 c(3, 3, 4), c(2,2,3)
        • @Chris 原来我之前误解了这个问题。我已经更新了答案以更正它,还包括一些解释。
        • @RonakShah 非常感谢!
        猜你喜欢
        • 2018-10-16
        • 2016-03-06
        • 1970-01-01
        • 2015-03-31
        • 2018-06-13
        • 2016-12-01
        • 2021-08-22
        • 2022-07-05
        • 1970-01-01
        相关资源
        最近更新 更多