Crie um data.frame onde uma coluna é uma lista

Eu sei como adicionar uma coluna de lista:

> df  df$b  df ab 1 1 1 2 2 1, 2 3 3 1, 2, 3 

Isso funciona, mas não:

 > df <- data.frame(a=1:3, b=list(1:1, 1:2, 1:3)) Error in data.frame(1L, 1:2, 1:3, check.names = FALSE, stringsAsFactors = TRUE) : arguments imply differing number of rows: 1, 2, 3 

Por quê?

Além disso, existe uma maneira de criar df (acima) em uma única chamada para data.frame ?

   

Ligeiramente obscuramente, de ?data.frame :

Se uma lista ou quadro de dados ou matriz é passada para ‘data.frame’ é como se cada componente ou coluna tivesse sido passado como um argumento separado (exceto para matrizes de class ‘”model.matrix”‘ e aquelas protegidas por ‘I’ ‘).

assim

 data.frame(a=1:3,b=I(list(1,1:2,1:3))) 

parece funcionar.

Se você está trabalhando com data.tables , então você pode evitar a chamada para I()

 library(data.table) # the following works as intended data.table(a=1:3,b=list(1,1:2,1:3)) ab 1: 1 1 2: 2 1,2 3: 3 1,2,3 

data_frame s (variadamente chamado tibbles , tbl_df , tbl ) suporta nativamente a criação de colunas de lista usando o construtor data_frame . Para usá-los, carregue uma das muitas bibliotecas com eles, como tibble , dplyr ou tidyverse .

 > data_frame(abc = letters[1:3], lst = list(1:3, 1:3, 1:3)) # A tibble: 3 × 2 abc lst   1 a  2 b  3 c  

Eles são, na verdade, data.frames sob o capô, mas de alguma forma modificados. Eles quase sempre podem ser usados ​​como data.frames normais. A única exceção que descobri é que, quando as pessoas realizam checagens inapropriadas, elas causam problemas:

 > #no problem > data.frame(x = 1:3, y = 1:3) %>% class [1] "data.frame" > data.frame(x = 1:3, y = 1:3) %>% class == "data.frame" [1] TRUE > #uh oh > data_frame(x = 1:3, y = 1:3) %>% class [1] "tbl_df" "tbl" "data.frame" > data_frame(x = 1:3, y = 1:3) %>% class == "data.frame" [1] FALSE FALSE TRUE > #dont use if with improper testing! > if(data_frame(x = 1:3, y = 1:3) %>% class == "data.frame") "something" Warning message: In if (data_frame(x = 1:3, y = 1:3) %>% class == "data.frame") "something" : the condition has length > 1 and only the first element will be used > #proper > data_frame(x = 1:3, y = 1:3) %>% inherits("data.frame") [1] TRUE 

Eu recomendo ler sobre eles em R 4 Data Science (grátis).