2012-03-03 15 views
53

wiem jak dodać kolumnę listy:Tworzenie data.frame gdzie kolumna jest 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 

To działa, ale nie:

> 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 

Dlaczego?

Czy istnieje sposób na utworzenie df (powyżej) w jednym wywołaniu na data.frame?

Odpowiedz

68

lekko niejasno z ?data.frame:

Jeśli lista lub danych ramki lub matryca jest przekazywana do „data.frame” jest tak jeśli każdy element lub kolumna została podana jako oddzielnego parametru ( z wyjątkiem macierzy klasy "" model.matrix "i tych chronionych przez " I ").

Więc

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

wydaje się działać.

+6

Dla zainteresowanych "I" oznacza "Inhibit Interperetation/Conversion of objects". Tworzy identyczny obiekt, ale z "AsIs" dołączonym do zestawu klas. Klasa "AsIs" jest naprawdę dostępna do odczytu przez funkcje data.frame() i formula(). Dowiedz się więcej [tutaj] (https://stat.ethz.ch/R-manual/R-devel/library/base/html/AsIs.html). – pwilcox

24

Jeśli pracujesz z data.tables, wtedy można uniknąć wywołanie 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

Jest to niedoceniany element '' 'data.table''' o szeroki margines –

15

data_frame s (różnie nazywane tibbles, tbl_df, tbl) natywnie wspierać tworzenie lista kolumn za pomocą konstruktora data_frame. Aby z nich korzystać, należy załadować jedną z wielu bibliotek, takich jak , dplyr lub 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]> 

Są faktycznie data.frames pod maską, ale nieco zmodyfikowany. Mogą być prawie zawsze używane jako normalne data.frames. Jedynym wyjątkiem znalazłem jest to, że gdy ludzie robią niewłaściwych klas kontrole, powodują problemy:

> #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 

I zalecających czytanie o nich w R 4 Data Science (za darmo).

Powiązane problemy