Как преобразовать список векторов неравной длины во фрейм данных - PullRequest
1 голос
/ 22 октября 2019

Мне нужно преобразовать следующий список во фрейм данных:

list(c(13, 5, 9, 16, 1, 7, 3, 20), c(0, 1, 2, 7, 8, 14, 20), c(2, 4, 7, 9, 12, 14, 16), 0:9, c(18, 19, 20, 21, 22, 23, 6, 7, 8, 9), c(0, 1, 7, 13, 19, 6, 12, 18, 2, 8), 23:22, c(18, 13, 8), c(18, 13, 8, 3, 10, 17, 12, 6, 0, 1), c(18, 14), c(18, 19, 20, 21, 13, 7, 8, 14, 2, 1), c(13, 15, 16, 9, 8, 7, 14, 20, 19, 18))

Список имеет следующую структуру:

List of 1
 $ :List of 12
  ..$ : int [1:8] 13 5 9 16 1 7 3 20
  ..$ : int [1:7] 0 1 2 7 8 14 20
  ..$ : int [1:7] 2 4 7 9 12 14 16
  ..$ : int [1:10] 0 1 2 3 4 5 6 7 8 9
  ..$ : int [1:10] 18 19 20 21 22 23 6 7 8 9
  ..$ : int [1:10] 0 1 7 13 19 6 12 18 2 8
  ..$ : int [1:2] 23 22
  ..$ : int [1:3] 18 13 8
  ..$ : int [1:10] 18 13 8 3 10 17 12 6 0 1
  ..$ : int [1:2] 18 14
  ..$ : int [1:10] 18 19 20 21 13 7 8 14 2 1
  ..$ : int [1:10] 13 15 16 9 8 7 14 20 19 18

Поскольку каждый вектор может состоять из 12 целых чисел, яхочу преобразовать этот список в фрейм данных, который выглядит следующим образом:

    P01 P02 P03 P04 P05 P06 P07 P08 P09 P10 P11 P12
D01 13  5   9   16  1   7   3   20  NA  NA  NA  NA
D02 0   1   2   7   8   14  20  NA  NA  NA  NA  NA
D03 2   4   7   9   12  14  16  NA  NA  NA  NA  NA

... and so on

Любые советы по исправлению, которые приветствуются.

Ответы [ 3 ]

5 голосов
/ 22 октября 2019

Предполагая, что ваш список списков называется x, вы можете использовать

sapply(1:12, function(i) sapply(x, `[`, i))

, чтобы получить нужные данные. Здесь мы перебираем различные индексы, которые вы хотите извлечь из каждого вектора. Так и происходит в R, когда вы просите о несуществующей позиции, вы получаете NA. Вам просто нужно добавить имена строк / столбцов с любыми желаемыми значениями.

2 голосов
/ 22 октября 2019

Преобразуйте каждый компонент списка L в серию ts, свяжите их вместе, удалите грязные имена, которые он назначает, и транспонируйте. Это даст матрицу с одной строкой на компонент и столько же столбцов, сколько самый длинный компонент.

t(unname(do.call("cbind", lapply(L, ts))))
2 голосов
/ 22 октября 2019

Вы можете сделать это, изменив длину исходных векторов в списке. Вызовите список a

a <- list(
    c(13, 5, 9, 16, 1, 7, 3, 20),
    c(0, 1, 2, 7, 8, 14, 20),
    c(2, 4, 7, 9, 12, 14, 16),
    0:9,
    c(18, 19, 20, 21, 22, 23, 6, 7, 8, 9),
    c(0, 1, 7, 13, 19, 6, 12, 18, 2, 8),
    23:22,
    c(18, 13, 8),
    c(18, 13, 8, 3, 10, 17, 12, 6, 0, 1),
    c(18, 14),
    c(18, 19, 20, 21, 13, 7, 8, 14, 2, 1),
    c(13, 15, 16, 9, 8, 7, 14, 20, 19, 18)
  )

Затем вычислите максимальную длину

n <- max(sapply(a, length))

И измените длины каждого элемента в списке

b <- lapply(a, function(el) {length(el) <- n ; el})
res <- do.call("rbind", b)

Наконец, поменяй имена

dimnames(res) <- list(sprintf("D%02i", 1:nrow(res)), 
                     sprintf("P%02i", 1:ncol(res)))
res
# P01 P02 P03 P04 P05 P06 P07 P08 P09 P10
# D01  13   5   9  16   1   7   3  20  NA  NA
# D02   0   1   2   7   8  14  20  NA  NA  NA
# D03   2   4   7   9  12  14  16  NA  NA  NA
# D04   0   1   2   3   4   5   6   7   8   9
# D05  18  19  20  21  22  23   6   7   8   9
# D06   0   1   7  13  19   6  12  18   2   8
# D07  23  22  NA  NA  NA  NA  NA  NA  NA  NA
# D08  18  13   8  NA  NA  NA  NA  NA  NA  NA
# D09  18  13   8   3  10  17  12   6   0   1
# D10  18  14  NA  NA  NA  NA  NA  NA  NA  NA
# D11  18  19  20  21  13   7   8  14   2   1
# D12  13  15  16   9   8   7  14  20  19  18
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...