У меня есть один список с большим количеством элементов (в конце предполагается, что это обратный индекс).

  • Все элементы представляют собой числовые векторы разной длины.
  • Имя элемента встречается несколько раз
> par.list
$NAMEA
[1]  1  2  3  4  5  7  8  9 10

$NAMEB
[1] 6

$NAMEB
[1] 11 12 13 16 17

$NAMEA
[1] 14 15 18 19 20

То, что я ищу, было таким эффективным, что я получаю

> merged.list
$NAMEA
[1]  1  2  3  4  5  7  8  9 10 14 15 18 19 20

$NAMEB
[1] 6 11 12 13 16 17

Я уверен, что есть простой способ сделать это, но мне просто не удалось найти здесь нужную ветку, поэтому я был бы признателен за любую помощь!

1
Galvin Hoang 9 Окт 2021 в 20:12

2 ответа

Лучший ответ

Мы можем stack указать list в двух столбцах data.frame и split

with(stack(par.list), split(values, ind))

-вывод

$NAMEA
 [1]  1  2  3  4  5  7  8  9 10 14 15 18 19 20

$NAMEB
[1]  6 11 12 13 16 17

Данные

par.list <- list(NAMEA = c(1, 2, 3, 4, 5, 7, 8, 9, 10), NAMEB = 6, NAMEB = c(11L, 
12L, 13L, 16L, 17L), NAMEA = c(14L, 15L, 18L, 19L, 20L))
2
akrun 9 Окт 2021 в 17:13

Другой вариант с lapply -

uq_names <- unique(names(par.list))

setNames(lapply(uq_names, function(x) 
        unlist(par.list[names(par.list) == x], use.names = FALSE)), uq_names)

#$NAMEA
# [1]  1  2  3  4  5  7  8  9 10 14 15 18 19 20

#$NAMEB
#[1]  6 11 12 13 16 17
0
Ronak Shah 10 Окт 2021 в 08:34