составить карту и составить список на основе имен списков - PullRequest
1 голос
/ 06 ноября 2019

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

List of 8
 $ 9              :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':    40 obs. of  2 variables:
  ..$ date: Date[1:40], format: "2014-03-22" "2019-03-18" "2018-04-28" ...
  ..$ .id : num [1:40] 9 9 9 9 9 9 9 9 9 9 ...
 $ c(1, 7)        :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':    40 obs. of  2 variables:
  ..$ date: Date[1:40], format: "2004-08-26" "2012-10-21" "2007-03-10" ...
  ..$ .id : num [1:40] 7 7 1 7 7 7 7 1 7 7 ...
 $ c(13, 18)      :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':    40 obs. of  2 variables:
  ..$ date: Date[1:40], format: "2016-01-31" "2016-03-24" "2018-10-17" ...
  ..$ .id : num [1:40] 13 13 13 18 13 18 13 13 13 13 ...
 $ c(18, 2, 7, 13):Classes ‘tbl_df’, ‘tbl’ and 'data.frame':    40 obs. of  2 variables:
  ..$ date: Date[1:40], format: "2013-04-05" "2019-04-23" "2005-03-05" ...
  ..$ .id : num [1:40] 13 2 7 2 2 13 13 7 13 7 ...
 $ c(19, 5)       :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':    40 obs. of  2 variables:
  ..$ date: Date[1:40], format: "2018-04-10" "2016-08-03" "2012-05-18" ...
  ..$ .id : num [1:40] 5 19 5 5 5 5 5 5 19 5 ...
 $ c(2, 7, 18)    :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':    40 obs. of  2 variables:
  ..$ date: Date[1:40], format: "2018-02-01" "2011-03-08" "2009-09-29" ...
  ..$ .id : num [1:40] 7 7 2 18 2 18 2 2 7 2 ...
 $ c(5, 19)       :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':    40 obs. of  2 variables:
  ..$ date: Date[1:40], format: "2011-05-14" "2005-08-31" "2015-07-06" ...
  ..$ .id : num [1:40] 19 5 5 5 5 19 5 5 5 5 ...
 $ c(7, 1, 2, 18) :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':    40 obs. of  2 variables:
  ..$ date: Date[1:40], format: "2003-04-12" "2014-12-03" "2001-02-21" ...
  ..$ .id : num [1:40] 7 1 1 7 2 1 1 18 2 1 ...

Имена списка следующие:

9
c(1, 7)
c(13, 18)
c(18, 2, 7, 13)
c(19, 5)
c(2, 7, 18)
c(5, 19)
c(7, 1, 2, 18)

Два списка выглядят так:

$`c(19, 5)`
# A tibble: 40 x 2
   date         .id
   <date>     <dbl>
 1 2018-04-10     5
 2 2016-08-03    19
 3 2012-05-18     5
 4 2007-09-11     5
 5 2011-11-03     5
 6 2007-04-09     5
 7 2001-07-12     5
 8 2018-07-30     5
 9 2013-07-30    19
10 2001-08-13     5
# ... with 30 more rows

$`c(2, 7, 18)`
# A tibble: 40 x 2
   date         .id
   <date>     <dbl>
 1 2018-02-01     7
 2 2011-03-08     7
 3 2009-09-29     2
 4 2014-07-30    18
 5 2004-04-17     2
 6 2016-11-21    18
 7 2007-10-27     2
 8 2009-02-08     2
 9 2016-01-18     7
10 2010-09-27     2
# ... with 30 more rows

Я хотел бы расположить списки по столбцам .id и date. Однако .id, упорядоченный в порядке, указанном в именах списков. Таким образом, для списка c(19, 5) 19 будет первым (также упорядоченным по дате), а 5 будет вторым (также упорядоченным по дате). Для списка c(5, 19) 5 будет упорядочен первым (а также упорядочен по дате), а 19 будет вторым (также упорядочен по дате).

Любые рекомендации о том, каксделать это было бы здорово.

данные:

lst <- list(`9` = structure(list(date = structure(c(16151, 17973, 17649, 
17738, 17388, 13927, 11594, 13095, 15312, 12030, 13805, 13240, 
15660, 15926, 11645, 12139, 17853, 15328, 12561, 13595, 14147, 
12142, 14112, 14083, 16057, 13074, 11458, 14735, 12892, 16139, 
11935, 17666, 14789, 12231, 12343, 17012, 13099, 17682, 15150, 
14195), class = "Date"), .id = c(9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 
9, 9, 9, 9, 9, 9, 9, 9, 9)), row.names = c(NA, -40L), class = c("tbl_df", 
"tbl", "data.frame")), `c(1, 7)` = structure(list(date = structure(c(12656, 
15634, 13582, 17498, 15079, 12265, 18031, 17399, 11603, 13886, 
16876, 16022, 16303, 17776, 12717, 15154, 12950, 13693, 17561, 
16963, 15690, 12581, 14883, 18010, 14280, 12672, 16108, 14347, 
14326, 14628, 17913, 13771, 15369, 14765, 12067, 16397, 11555, 
14855, 16308, 12824), class = "Date"), .id = c(7, 7, 1, 7, 7, 
7, 7, 1, 7, 7, 1, 1, 7, 1, 7, 1, 1, 1, 7, 1, 7, 1, 1, 1, 1, 1, 
1, 7, 7, 1, 7, 7, 7, 7, 1, 1, 7, 7, 1, 1)), row.names = c(NA, 
-40L), class = c("tbl_df", "tbl", "data.frame")), `c(13, 18)` = structure(list(
    date = structure(c(16831, 16884, 17821, 15686, 14680, 16428, 
    17462, 15693, 14707, 16889, 17534, 17556, 15243, 17308, 16886, 
    17212, 15199, 15669, 17761, 17103, 16992, 17396, 17584, 15904, 
    15643, 16748, 17554, 16822, 17184, 16264, 15425, 16715, 15268, 
    15205, 14772, 17285, 17184, 16112, 15327, 17100), class = "Date"), 
    .id = c(13, 13, 13, 18, 13, 18, 13, 13, 13, 13, 13, 13, 18, 
    13, 18, 13, 13, 13, 18, 18, 13, 13, 13, 13, 18, 18, 13, 13, 
    13, 18, 13, 13, 13, 13, 13, 13, 18, 18, 18, 13)), row.names = c(NA, 
-40L), class = c("tbl_df", "tbl", "data.frame")), `c(18, 2, 7, 13)` = structure(list(
    date = structure(c(15800, 18009, 12847, 12378, 12365, 14864, 
    14961, 14562, 15723, 15856, 11545, 11755, 15080, 13149, 12655, 
    14898, 13067, 14375, 15499, 16681, 15682, 18030, 15732, 14452, 
    17624, 15741, 17894, 12768, 17295, 12015, 16533, 13589, 17072, 
    14678, 14067, 14348, 16846, 18125, 17826, 16874), class = "Date"), 
    .id = c(13, 2, 7, 2, 2, 13, 13, 7, 13, 7, 7, 7, 7, 2, 7, 
    7, 7, 7, 7, 18, 13, 13, 18, 7, 2, 7, 7, 7, 13, 2, 2, 2, 7, 
    18, 7, 2, 2, 18, 13, 18)), row.names = c(NA, -40L), class = c("tbl_df", 
"tbl", "data.frame")), `c(19, 5)` = structure(list(date = structure(c(17631, 
17016, 15478, 13767, 15281, 13612, 11515, 17742, 15916, 11547, 
12959, 16713, 12521, 12457, 12174, 18054, 16407, 13462, 14704, 
16642, 12551, 16289, 12034, 17676, 16486, 15009, 17220, 16753, 
13335, 12498, 12697, 17725, 17833, 16329, 17182, 16435, 11475, 
14732, 15210, 17823), class = "Date"), .id = c(5, 19, 5, 5, 5, 
5, 5, 5, 19, 5, 5, 19, 5, 5, 5, 19, 5, 5, 5, 5, 5, 5, 5, 5, 19, 
5, 5, 5, 5, 5, 5, 19, 19, 19, 19, 5, 5, 19, 5, 5)), row.names = c(NA, 
-40L), class = c("tbl_df", "tbl", "data.frame")), `c(2, 7, 18)` = structure(list(
    date = structure(c(17563, 15041, 14516, 16281, 12525, 17126, 
    13813, 14283, 16818, 14879, 15860, 16616, 17303, 15356, 14899, 
    14306, 15254, 17836, 12555, 15367, 17721, 16216, 16787, 16603, 
    14723, 13608, 13276, 17852, 16922, 17774, 14676, 16696, 17059, 
    15518, 13829, 14623, 17787, 14534, 17579, 15137), class = "Date"), 
    .id = c(7, 7, 2, 18, 2, 18, 2, 2, 7, 2, 7, 7, 18, 7, 7, 7, 
    7, 18, 7, 2, 7, 2, 7, 2, 2, 7, 2, 18, 18, 2, 18, 18, 2, 2, 
    7, 2, 7, 2, 2, 7)), row.names = c(NA, -40L), class = c("tbl_df", 
"tbl", "data.frame")), `c(5, 19)` = structure(list(date = structure(c(15108, 
13026, 16622, 12813, 11591, 15364, 16033, 16594, 15353, 14652, 
14697, 17160, 17084, 16686, 13560, 11401, 16433, 11722, 17606, 
15924, 16235, 17817, 16172, 14612, 12021, 17276, 18080, 16222, 
16849, 14746, 14036, 17850, 11350, 15036, 15577, 14833, 16464, 
15322, 15988, 17023), class = "Date"), .id = c(19, 5, 5, 5, 5, 
19, 5, 5, 5, 5, 19, 19, 19, 19, 5, 5, 19, 5, 19, 5, 19, 19, 5, 
19, 5, 19, 5, 19, 19, 19, 5, 19, 5, 19, 5, 19, 5, 5, 19, 19)), row.names = c(NA, 
-40L), class = c("tbl_df", "tbl", "data.frame")), `c(7, 1, 2, 18)` = structure(list(
    date = structure(c(12154, 16407, 11374, 12594, 13229, 13812, 
    12462, 16255, 16181, 15333, 15337, 16019, 14551, 16383, 13281, 
    15422, 12951, 17836, 16740, 12130, 18142, 16458, 18148, 15173, 
    12506, 15581, 15244, 16519, 15785, 17916, 17575, 15128, 15274, 
    15808, 12137, 16425, 15927, 14696, 12771, 12894), class = "Date"), 
    .id = c(7, 1, 1, 7, 2, 1, 1, 18, 2, 1, 2, 2, 1, 7, 7, 1, 
    1, 18, 2, 2, 2, 1, 18, 2, 1, 1, 7, 18, 7, 18, 2, 18, 1, 7, 
    2, 1, 7, 2, 2, 2)), row.names = c(NA, -40L), class = c("tbl_df", 
"tbl", "data.frame")))

Ответы [ 2 ]

3 голосов
/ 06 ноября 2019

Вы можете сделать что-то вроде следующего:

# Loop over names of list
newlist <- lapply(names(lst), function(i) {
  # Subset list by name
  thislist <- lst[[i]]

  # evaluate the list name
  i <- eval(parse(text = i))

  # order list
  thislist[order(factor(thislist$.id, levels = as.character(i))),]
})
1 голос
/ 06 ноября 2019

Мы можем использовать imap из purrr и match и order, чтобы упорядочить каждый фрейм данных

purrr::imap(lst, ~.x[order(match(.x$.id, eval(parse(text = .y)))), ])

#$`9`
# A tibble: 40 x 2
#   date         .id
#   <date>     <dbl>
# 1 2014-03-22     9
# 2 2019-03-18     9
# 3 2018-04-28     9
# 4 2018-07-26     9
# 5 2017-08-10     9
# 6 2008-02-18     9
# 7 2001-09-29     9
# 8 2005-11-08     9
# 9 2011-12-04     9
#10 2002-12-09     9
# … with 30 more rows

#$`c(1, 7)`
# A tibble: 40 x 2
#   date         .id
#   <date>     <dbl>
# 1 2007-03-10     1
# 2 2017-08-21     1
# 3 2016-03-16     1
# 4 2013-11-13     1
# 5 2018-09-02     1
# 6 2011-06-29     1
# 7 2005-06-16     1
# 8 2007-06-29     1
# 9 2016-06-11     1
#10 2004-06-12     1
# … with 30 more rows
#....
#.....

В базе R это может быть достигнуто с помощью Map

Map(function(x, y) x[order(match(x$.id, y)), ], lst, 
         lapply(names(lst), function(x) eval(parse(text = x))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...