Crea un data.frame donde una columna es una lista

Sé cómo agregar una columna de lista:

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

Esto funciona, pero no:

 > 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é?

Además, ¿hay alguna manera de crear df (arriba) en una sola llamada a data.frame ?

Un poco oscuramente, desde ?data.frame :

Si una lista o dataframe o matriz se pasa a ‘data.frame’, es como si cada componente o columna se hubiera pasado como un argumento separado (a excepción de las matrices de la clase ‘”model.matrix”‘ y las protegidas por ‘I ‘).

Asi que

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

parece funcionar.

Si está trabajando con data.tables , puede evitar la llamada a 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 (diversamente llamado tibbles , tbl_df , tbl ) admite de forma nativa la creación de columnas de lista utilizando el constructor data_frame . Para usarlos, cargue una de las muchas bibliotecas con ellos, como tibble , dplyr o 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  

En realidad son data.frames bajo el capó, pero algo modificados. Casi siempre se pueden usar como data.frames normales. La única excepción que he encontrado es que cuando las personas hacen controles de clase inapropiados, causan 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 

Recomiendo leer sobre ellos en R 4 Data Science (gratis).