Использование dplyr для организации списка списков в R - PullRequest
0 голосов
/ 28 августа 2018

Это мой список:

mylist<-
list(list(A = c(30, 50, 35, 25, 45), B = c(40, 35, 35, 50, 45
), C = c(40, 20, 40, 50, 25), D = c(35, 45, 45, 45, 40), E = c(20, 
30, 50, 45, 20), F = c(40, 40, 50, 30, 40)), list(A = c(50, 50, 
25, 40, 45, 40, 35, 40, 45, 20), B = c(40, 35, 40, 40, 45, 30, 
20, 50, 35, 25), C = c(20, 30, 50, 35, 45, 40, 25, 50, 35, 50
), D = c(20, 35, 30, 25, 40, 30, 50, 20, 25, 35), E = c(40, 25, 
25, 20, 50, 30, 50, 40, 35, 35), F = c(50, 20, 45, 35, 50, 45, 
30, 45, 35, 50)), list(A = c(45, 50, 25, 25, 30, 25, 35, 35, 
35, 30, 50, 50, 30, 30, 20), B = c(40, 20, 35, 35, 50, 20, 25, 
30, 35, 20, 40, 20, 45, 30, 20), C = c(50, 20, 25, 35, 35, 30, 
50, 25, 40, 35, 45, 45, 35, 45, 25), D = c(50, 50, 25, 35, 25, 
35, 20, 25, 45, 40, 35, 40, 50, 40, 30), E = c(50, 25, 20, 30, 
40, 45, 40, 50, 35, 40, 30, 45, 35, 50, 40), F = c(35, 50, 35, 
45, 25, 40, 50, 40, 50, 50, 50, 50, 35, 35, 40)), list(A = c(50, 
50, 50, 40, 20, 25, 50, 40, 50, 50, 45, 40, 30, 50, 35, 45, 50, 
30, 35, 45), B = c(45, 20, 25, 20, 25, 30, 20, 30, 45, 25, 50, 
30, 30, 25, 50, 45, 20, 45, 45, 50), C = c(20, 40, 50, 25, 40, 
45, 25, 30, 20, 20, 35, 45, 20, 40, 50, 45, 40, 40, 45, 35), 
    D = c(40, 40, 20, 25, 50, 50, 35, 45, 50, 45, 50, 35, 30, 
    40, 35, 45, 25, 45, 45, 25), E = c(20, 25, 35, 45, 35, 40, 
    40, 35, 35, 40, 30, 30, 40, 50, 25, 40, 30, 25, 20, 40)), 
    list(A = c(35, 25, 45, 20, 25, 30, 30, 35, 30, 40, 30, 20, 
    20, 30, 45, 40, 35, 35, 35, 35, 25, 45, 35, 20, 50), B = c(50, 
    35, 30, 30, 35, 45, 45, 50, 25, 25, 40, 25, 50, 45, 25, 30, 
    30, 25, 45, 45, 30, 20, 50, 30, 30), C = c(35, 40, 50, 25, 
    40, 45, 30, 25, 50, 25, 35, 50, 50, 50, 25, 50, 20, 50, 40, 
    25, 25, 35, 20, 20, 50), D = c(40, 35, 35, 40, 50, 35, 25, 
    40, 25, 25, 30, 45, 50, 35, 20, 50, 20, 20, 45, 50, 40, 30, 
    35, 50, 45), E = c(40, 25, 50, 50, 20, 50, 25, 50, 40, 30, 
    30, 50, 45, 45, 40, 45, 20, 20, 45, 35, 45, 50, 40, 40, 35
    ), F = c(40, 45, 35, 35, 30, 45, 40, 40, 20, 50, 50, 45, 
    40, 40, 45, 45, 35, 40, 20, 30, 35, 45, 30, 50, 25)))

Мне нужно отправить на первую позицию списка (mylist[[1]]) все элементы «А». Элементы «А»: mylist[[1]][[1]],mylist[[2]][[1]],mylist[[3]][[1]],mylist[[4]][[1]],mylist[[5]][[1]].

А затем ко второй позиции в списке (mylist[[2]]) все элементы "B". Элементы "B": mylist[[1]][[2]],mylist[[2]][[2]],mylist[[3]][[2]],mylist[[4]][[2]],mylist[[5]][[2]].

и т. Д.

Возможно ли это сделать с помощью пакета dplyr?

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Это то, что вы ищете?

dplyr::bind_rows(mylist, .id = 'id')

# A tibble: 75 x 7
   id        A     B     C     D     E     F
   <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1 1        30    40    40    35    20    40
 2 1        50    35    20    45    30    40
 3 1        35    35    40    45    50    50
 4 1        25    50    50    45    45    30
 5 1        45    45    25    40    20    40
 6 2        50    40    20    20    40    50
 7 2        50    35    30    35    25    20
 8 2        25    40    50    30    25    45
 9 2        40    40    35    25    20    35
10 2        45    45    45    40    50    50
# ... with 65 more rows

Или то же самое, преобразованное обратно в list форму:

dplyr::bind_rows(mylist, .id = 'id') %>% as.list()

$id
 [1] "1" "1" "1" "1" "1" "2" "2" "2" "2" "2" "2" "2" "2" "2" "2" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "3" "4" "4" "4" "4" "4" "4" "4" "4"
[39] "4" "4" "4" "4" "4" "4" "4" "4" "4" "4" "4" "4" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5"

$A
 [1] 30 50 35 25 45 50 50 25 40 45 40 35 40 45 20 45 50 25 25 30 25 35 35 35 30 50 50 30 30 20 50 50 50 40 20 25 50 40 50 50 45 40 30 50 35 45 50 30 35 45 35
[52] 25 45 20 25 30 30 35 30 40 30 20 20 30 45 40 35 35 35 35 25 45 35 20 50

$B
 [1] 40 35 35 50 45 40 35 40 40 45 30 20 50 35 25 40 20 35 35 50 20 25 30 35 20 40 20 45 30 20 45 20 25 20 25 30 20 30 45 25 50 30 30 25 50 45 20 45 45 50 50
[52] 35 30 30 35 45 45 50 25 25 40 25 50 45 25 30 30 25 45 45 30 20 50 30 30

$C
 [1] 40 20 40 50 25 20 30 50 35 45 40 25 50 35 50 50 20 25 35 35 30 50 25 40 35 45 45 35 45 25 20 40 50 25 40 45 25 30 20 20 35 45 20 40 50 45 40 40 45 35 35
[52] 40 50 25 40 45 30 25 50 25 35 50 50 50 25 50 20 50 40 25 25 35 20 20 50

$D
 [1] 35 45 45 45 40 20 35 30 25 40 30 50 20 25 35 50 50 25 35 25 35 20 25 45 40 35 40 50 40 30 40 40 20 25 50 50 35 45 50 45 50 35 30 40 35 45 25 45 45 25 40
[52] 35 35 40 50 35 25 40 25 25 30 45 50 35 20 50 20 20 45 50 40 30 35 50 45

$E
 [1] 20 30 50 45 20 40 25 25 20 50 30 50 40 35 35 50 25 20 30 40 45 40 50 35 40 30 45 35 50 40 20 25 35 45 35 40 40 35 35 40 30 30 40 50 25 40 30 25 20 40 40
[52] 25 50 50 20 50 25 50 40 30 30 50 45 45 40 45 20 20 45 35 45 50 40 40 35

$F
 [1] 40 40 50 30 40 50 20 45 35 50 45 30 45 35 50 35 50 35 45 25 40 50 40 50 50 50 50 35 35 40 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 40
[52] 45 35 35 30 45 40 40 20 50 50 45 40 40 45 45 35 40 20 30 35 45 30 50 25
0 голосов
/ 29 августа 2018

На всякий случай, мой вариант использует base функции: unlist и lapply

x <- unlist(mylist) #Turns mylist into a vector
res <- lapply(LETTERS[1:6], function(u) x[grep(u,names(x))]) #Filtering into a list the elements whose name is in the vector "A" through"F"
res <- lapply(res, unname) #To get rid of the created label names
names(res) <- LETTERS[1:6] #Names of the elements in the new list
res
$`A`
 [1] 30 50 35 25 45 50 50 25 40 45 40 35 40 45 20 45 50 25 25 30 25 35 35 35 30 50 50
[28] 30 30 20 50 50 50 40 20 25 50 40 50 50 45 40 30 50 35 45 50 30 35 45 35 25 45 20
[55] 25 30 30 35 30 40 30 20 20 30 45 40 35 35 35 35 25 45 35 20 50

$B
 [1] 40 35 35 50 45 40 35 40 40 45 30 20 50 35 25 40 20 35 35 50 20 25 30 35 20 40 20
[28] 45 30 20 45 20 25 20 25 30 20 30 45 25 50 30 30 25 50 45 20 45 45 50 50 35 30 30
[55] 35 45 45 50 25 25 40 25 50 45 25 30 30 25 45 45 30 20 50 30 30

$C
 [1] 40 20 40 50 25 20 30 50 35 45 40 25 50 35 50 50 20 25 35 35 30 50 25 40 35 45 45
[28] 35 45 25 20 40 50 25 40 45 25 30 20 20 35 45 20 40 50 45 40 40 45 35 35 40 50 25
[55] 40 45 30 25 50 25 35 50 50 50 25 50 20 50 40 25 25 35 20 20 50

$D
 [1] 35 45 45 45 40 20 35 30 25 40 30 50 20 25 35 50 50 25 35 25 35 20 25 45 40 35 40
[28] 50 40 30 40 40 20 25 50 50 35 45 50 45 50 35 30 40 35 45 25 45 45 25 40 35 35 40
[55] 50 35 25 40 25 25 30 45 50 35 20 50 20 20 45 50 40 30 35 50 45

$E
 [1] 20 30 50 45 20 40 25 25 20 50 30 50 40 35 35 50 25 20 30 40 45 40 50 35 40 30 45
[28] 35 50 40 20 25 35 45 35 40 40 35 35 40 30 30 40 50 25 40 30 25 20 40 40 25 50 50
[55] 20 50 25 50 40 30 30 50 45 45 40 45 20 20 45 35 45 50 40 40 35

$F
 [1] 40 40 50 30 40 50 20 45 35 50 45 30 45 35 50 35 50 35 45 25 40 50 40 50 50 50 50
[28] 35 35 40 40 45 35 35 30 45 40 40 20 50 50 45 40 40 45 45 35 40 20 30 35 45 30 50
[55] 25
0 голосов
/ 28 августа 2018
purrr::transpose(mylist)


# $A
# $A[[1]]
# [1] 30 50 35 25 45
# 
# $A[[2]]
#  [1] 50 50 25 40 45 40 35 40 45 20
# 
# $A[[3]]
#  [1] 45 50 25 25 30 25 35 35 35 30 50 50 30 30 20
# 
# $A[[4]]
#  [1] 50 50 50 40 20 25 50 40 50 50 45 40 30 50 35 45 50 30 35 45
# 
# $A[[5]]
#  [1] 35 25 45 20 25 30 30 35 30 40 30 20 20 30 45 40 35 35 35 35 25 45 35 20 50
# 
# 
# $B
# $B[[1]]
# [1] 40 35 35 50 45
# 
# $B[[2]]
#  [1] 40 35 40 40 45 30 20 50 35 25
# 
# $B[[3]]
#  [1] 40 20 35 35 50 20 25 30 35 20 40 20 45 30 20
# 
# $B[[4]]
#  [1] 45 20 25 20 25 30 20 30 45 25 50 30 30 25 50 45 20 45 45 50
# 
# $B[[5]]
#  [1] 50 35 30 30 35 45 45 50 25 25 40 25 50 45 25 30 30 25 45 45 30 20 50 30 30
# 
# 
# $C
# $C[[1]]
# [1] 40 20 40 50 25
# 
# $C[[2]]
#  [1] 20 30 50 35 45 40 25 50 35 50
# 
# $C[[3]]
#  [1] 50 20 25 35 35 30 50 25 40 35 45 45 35 45 25
# 
# $C[[4]]
#  [1] 20 40 50 25 40 45 25 30 20 20 35 45 20 40 50 45 40 40 45 35
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...