Преобразование списка списков во фрейм данных - PullRequest
0 голосов
/ 30 января 2019

У меня есть функция, которая сначала генерирует список векторов (генерируемых с помощью lapply), а затем привязывает его к вектору столбца.Я думал, что это приведет к созданию кадра данных.Тем не менее, он создает список списков.

Функция cbind работает не так, как я думал.

Вот небольшой пример того, что генерирует функция

col_test <- c(1, 2, 1, 1, 2)
lst_test <- list(c(1, 2 , 3), c(2, 2, 2), c(1, 1, 2), c(1, 2, 2), c(1, 1, 1))
a_df <- cbind(col_test, lst_test)

Ввод

> a_df[1,]

дает вывод

$`col_test`
[1] 1

$lst_test
[1] 1 2 3

Я бы хотел, чтобы кадр данных был

     [,1] [,2] [,3] [,4]
[1,] 1    1    2    3

[2,] 2    2    2    2

[3,] 1    1    1    2

[4,] 1    1    2    2

[5,] 2    1    1    1

Как мне получить его в этой форме?

Ответы [ 4 ]

0 голосов
/ 30 января 2019
col_test <- c(1, 2, 1, 1, 2)
lst_test <- list(c(1, 2 , 3), c(2, 2, 2), c(1, 1, 2), c(1, 2, 2), c(1, 1, 1))

назовите подсписки, чтобы мы могли использовать bind_rows

names(lst_test) <- 1:length(lst_test)   
lst_test1 <- bind_rows(lst_test)

функция bind_rows связывается с помощью cols в этом случае, поэтому нам нужно повернуть ее

lst_test_pivot <- t(lst_test1) 

, но это даетнам матрицу, поэтому нам нужно привести ее обратно к фрейму данных

lst_test_pivot_df <- as.data.frame(lst_test_pivot)

, теперь он работает, так как

cbind(col_test, lst_test_pivot_df)

теперь производит

  col_test V1 V2 V3
1        1  1  2  3
2        2  2  2  2
3        1  1  1  2
4        1  1  2  2
5        2  1  1  1
0 голосов
/ 30 января 2019
data.frame(col_test,t(as.data.frame(lst_test)))
0 голосов
/ 30 января 2019
do.call(rbind, Map(c, col_test, lst_test))
#     [,1] [,2] [,3] [,4]
#[1,]    1    1    2    3
#[2,]    2    2    2    2
#[3,]    1    1    1    2
#[4,]    1    1    2    2
#[5,]    2    1    1    1
0 голосов
/ 30 января 2019

Это должно сработать.Обратите внимание, что мы используем do.call, поэтому отдельные элементы lst_test отправляются в качестве параметров в cbind, что не позволяет cbind создавать список списков.t используется для транспонирования полученной матрицы в нужную вам ориентацию, и, наконец, еще одна cbind с col_test также вставляет эти данные.

library(tidyverse)

mat.new <- do.call(cbind, lst_test) %>% 
  t %>% 
  cbind(col_test, .) %>% 
  unname

     [,1] [,2] [,3] [,4]
[1,]    1    1    2    3
[2,]    2    2    2    2
[3,]    1    1    1    2
[4,]    1    1    2    2
[5,]    2    1    1    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...