Как агрегировать имена списка () в R - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть список, созданный так:

$`a`
[1] 3
$`a`
[1] 15
$`a`
[1] 30
$`b`
[1] 3
$`b`
[1] 9
$`c`
[1] 15
$`c`
[1] 21

Интересно, есть ли какой-нибудь метод, который мог бы объединить один и тот же $ в списке () вместе, чтобы он выглядел так:

$`a`
[1] 3 15 30
$`b`
[1] 3 9
$`c`
[1] 15 21

Большое спасибо за добрый ответ!

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Другой вариант будет

unstack(stack(l))
$a
[1] 1 2 3

$b
[1] 4 5

$c
[1] 6

data

l <- list(a = 1, a = 2, a = 3, b = 4, b = 5, c = 6)
0 голосов
/ 07 февраля 2019

Мы unlist list (при условии, что существует один элемент списка и split он основан на names из list

split(unlist(lst1, use.names = FALSE), names(lst1))
#$a
#[1] 1 2 3

#$b
#[1] 4 5

#$c
#[1] 6

Для общегорегистр, то есть элементы с length больше 1

with(stack(lst1), split(values, ind))

Однако stack будет немного медленным для больших наборов данных, поэтому в этом случае используйте split с lengths

split(unlist(lst1), rep(names(lst1), lengths(lst1)))

Тесты

Тесты для большого набора данных

lst2 <- rep(lst1, 1e5)
system.time(split(unlist(lst2, use.names = FALSE), names(lst2)))
#   user  system elapsed 
#  0.067   0.009   0.076 
system.time(unstack(stack(lst2)))
#   user  system elapsed 
#  0.696   0.031   0.681 
system.time(with(stack(lst2), split(values, ind)))
#   user  system elapsed 
#  0.447   0.027   0.475 
system.time(split(unlist(lst2), rep(names(lst2), lengths(lst2))))
#   user  system elapsed 
#  0.100   0.005   0.105 

data

lst1 <- list(a = 1, a = 2, a = 3, b = 4, b = 5, c = 6)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...