2012-03-03 9 views
53

Sé cómo agregar una columna de lista:Crear un hoja.de.datos en una columna es una lista

> df <- data.frame(a=1:3) 
> df$b <- list(1:1, 1:2, 1:3) 
> df 
    a  b 
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 al data.frame?

Respuesta

68

Ligeramente oscuramente, desde ?data.frame:

Si una trama o matriz lista o datos se pasan a 'data.frame' es como si cada componente o columna había sido aprobada como un argumento separado (a excepción de las matrices de la clase '' model.matrix '' y las protegidas por 'I').

Así

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

parece funcionar.

+6

Para los interesados, "I" significa "Inhibir Interperetación/Conversión de objetos". Crea un objeto idéntico pero con "AsIs" anexados al conjunto de clases. La clase "AsIs" realmente está allí para ser leída por las funciones data.frame() y formula(). Obtenga más información [aquí] (https://stat.ethz.ch/R-manual/R-devel/library/base/html/AsIs.html). – pwilcox

24

Si está trabajando con data.tables, a continuación, se 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)) 

    a  b 
1: 1  1 
2: 2 1,2 
3: 3 1,2,3 
+0

Esta es una característica subestimada de '' 'data.table''' por un amplio margen –

15

data_frame s (diversamente llamados tibbles, tbl_df, tbl) soporte nativo de la creación de columnas de la 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 
    <chr> <list> 
1  a <int [3]> 
2  b <int [3]> 
3  c <int [3]> 

Ellos son en realidad data.frames bajo el capó, pero con algunas modificaciones. Casi siempre se pueden usar como normales data.frames. La única excepción que he encontrado es que cuando las personas hacen comprobaciones de clase inadecuados, 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 

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

Cuestiones relacionadas