【问题标题】:Length of the longest element in a list列表中最长元素的长度
【发布时间】:2018-12-12 11:00:39
【问题描述】:

我有一个如下所示的列表:

[[1]]
[1] -3

[[2]]
[1] 0 0

[[3]]
[1]   6 -36  54

我想从中创建一个看起来像

的向量
3 -36 54

为此,我考虑在元素末尾添加零,足以使元素大小相等并使用

Reduce('+',....)

将元素粘贴在一起。但是,我不想添加过多的零。提到的列表不是我想要的列表。我有多个列表。最后我的问题是:有没有办法从列表中检索元素的最大长度?

【问题讨论】:

  • 我很难理解这一点,但我认为我可以遵循一些答案。你想近似一个矩阵,即你的意思是在最后添加零吗?

标签: r list


【解决方案1】:

我们用lengths 得到list 的各个元素的length,然后用max 得到它的max 值,创建一个逻辑索引并将list 子集化

i1 <-  max(lengths(lst))
i2 <- lengths(lst)== i1
lst[i2]

假设 OP 想要帖子中描述的向量

f1 <- function(listA, i = 1) {
   i1 <- max(lengths(listA))
   listB <- lapply(listA, `length<-`, i1)
   Reduce(`+`, lapply(listB, function(x) replace(x, is.na(x), 0)))


   }

f1(lst)
#[1]   3 -36  54

如果我们在matrix 中需要它,可以使用stri_list2matrix 完成,并通过rowSums 获取sum

library(stringi)
out <- stri_list2matrix(lst)
class(out) <- 'numeric'
rowSums(out, na.rm = TRUE)
#[1]   3 -36  54

数据

lst <- list(-3, c(0, 0), c(6, -36, 54))

【讨论】:

    【解决方案2】:

    您可以将列表扩展为一个填充有NA 的矩阵并在其上使用rowSums

    # Data
    foo <- list(-3, c(0, 0), c(6, -36, 54))
    rowSums(sapply(foo, "[", seq_len(max(lengths(foo)))), na.rm = TRUE)
    [1]   3 -36  54
    

    sapply 生成使用列表中最长向量长度的矩阵 (seq_len(max(lengths(foo)))):

         [,1] [,2] [,3]
    [1,]   -3    0    6
    [2,]   NA    0  -36
    [3,]   NA   NA   54
    

    【讨论】:

      【解决方案3】:

      带有辅助函数的Reduce() 解决方案:

      `%+na%` <- function(x, y) {
        # Originally from: # https://stackoverflow.com/a/13106770/4552295 
        ifelse(is.na(x), y, ifelse(is.na(y), x, x + y)) 
      }
      
      n <- max(lengths(lst))    
      Reduce("%+na%", lapply(lst, "[", 1:n))
      [1]   3 -36  54
      

      【讨论】:

        猜你喜欢
        • 2015-12-29
        • 2013-01-16
        • 2012-05-19
        • 1970-01-01
        • 2019-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多