列表中最长元素的长度

时间:2018-12-12 11:00:39

标签: r list

我有一个看起来像这样的列表:

[[1]]
[1] -3

[[2]]
[1] 0 0

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

我想以此创建一个向量

3 -36 54

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

Reduce('+',....)

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

3 个答案:

答案 0 :(得分:1)

我们用length获得list的各个元素的lengths,然后用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完成,并使用sum获取rowSums

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))

答案 1 :(得分:0)

您可以将列表扩展为一个由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

答案 2 :(得分:0)

具有辅助功能的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