Длина самого длинного элемента в списке - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть список, который выглядит следующим образом:

[[1]]
[1] -3

[[2]]
[1] 0 0

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

Я хочу создать вектор из этого, который выглядит как

3 -36 54

Чтобы сделать это, я решил добавить нулив конце элементов достаточно просто сделать элементы одинакового размера и использовать

Reduce('+',....)

для вставки элементов вместе.Однако я не хочу добавлять лишнее количество нулей.В упомянутом списке нет необходимости в списке, для которого я хочу этого.У меня есть несколько списков.Наконец, мой вопрос: есть ли способ получить наибольшую длину элемента из списка?

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Вы можете расширить свой список до матрицы, заполненной 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
0 голосов
/ 12 декабря 2018

A 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
0 голосов
/ 12 декабря 2018

Мы получаем length отдельных элементов list с помощью lengths, затем получаем значение max с помощью max, создаем логический индекс и устанавливаем подмножество list

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

Предполагая, что ОП хотел вектор, как описано в посте

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...