2013-04-12 14 views
8

Chcę utworzyć strukturę danych w formieZapisywanie listy w elemencie ramki danych w R

Start, End, Elements 
    3 , 6 , {4,5} 
    4 , 10 , {7,8,9} 
    .... 

w słowach, ja ruszam piłkę wzdłuż linii. "Start" reprezentuje lewą pozycję najbardziej piłki, a "Koniec" reprezentuje najbardziej prawe. "Elementy" oznaczają, że w jakiś sposób znajduję te pozycje specjalne. Jaka jest najlepsza struktura danych do wykorzystania, gdy liczba elementów może się bardzo powiększyć? Jedyne, co mogę wymyślić to ramka danych, w której trzecia kolumna jest odpowiednio sformatowanym łańcuchem. Musiałbym wtedy przeanalizować ciąg znaków, jeśli chciałbym spojrzeć na każdą liczbę w zbiorze. Czy istnieje lepszy format danych, który R ma lub ma na ten temat?

Dzięki!

+2

Dlaczego nie tylko lista? – joran

+0

Właściwie to działało świetnie i było łatwe do wdrożenia. Nie zdawałem sobie sprawy, że ramka danych może przechowywać listę wewnątrz. Perfekcyjnie, dziękuję – user1357015

+0

dlaczego ani @joran, ani OP nie umieszczają tego jako odpowiedzi? –

Odpowiedz

12

Opcja wspomniałem w moim komentarzu, czyli po prostu na podstawie listy do jednej z kolumn:

dat <- data.frame(Start = 3:4, End = c(6,10)) 
> dat 
    Start End 
1  3 6 
2  4 10 
> dat$Elements <- list(4:5,7:9) 
> dat 
    Start End Elements 
1  3 6  4, 5 
2  4 10 7, 8, 9 

Można też oczywiście ramek danych rów całkowicie i po prostu użyć zwykłego stare listy (co może uczynić więcej sens w wielu przypadkach, w każdym razie):

list(list(Start = 3,End = 6, Elements = 4:5),list(Start = 4,End = 10,Elements = 7:9)) 
[[1]] 
[[1]]$Start 
[1] 3 

[[1]]$End 
[1] 6 

[[1]]$Elements 
[1] 4 5 


[[2]] 
[[2]]$Start 
[1] 4 

[[2]]$End 
[1] 10 

[[2]]$Elements 
[1] 7 8 9 
+1

i jeśli używasz 'data.table', możesz zrobić to wszystko w jednym wierszu:' data.table (Start = 3: 4, Koniec = c (6,10), Elementy = lista (4: 5, 7 : 9)) ' – eddi

+2

@eddi Tak, ale musisz użyć ** data.table **. : p – joran

+3

nie trzeba, ** dostać się do ** - gdyby to zależało ode mnie, nie byłoby więcej "danych.frame" :) – eddi

6

Mogłeś zapisać go jako wysoki ramki danych, zamiast jednego szerokiego i prawdopodobnie użyć data.table przetworzyć go skutecznie. Oznacza to, zrobić jeden wiersz na elemencie niż jednym rzędem za parę początek koniec

library(data.table) 
dt = data.table(Start=c(3, 3, 4, 4, 4), End=c(6, 6, 10, 10, 10), Elements=c(4, 5, 7, 8, 9)) 
# Start End Elements 
#1:  3 6  4 
#2:  3 6  5 
#3:  4 10  7 
#4:  4 10  8 
#5:  4 10  9 

To pozwoli Ci zrobić wiele rodzajów przetwarzania na dane łatwo, takich jak określanie ile elementy są w każdym zakresie:

dt[, list(Num.Elements=length(Elements)), by=c("Start", "End")] 

# Start End Num.Elements 
# 1:  3 6   2 
# 2:  4 10   3 

To również dane łatwy w obsłudze dla działek z wykorzystaniem pakietu ggplot, które zwykle oczekuje dane są w wysokiej formie.

Można zauważyć, że ta struktura danych jest nieekonomiczna, ponieważ powtarza początek i koniec każdego elementu. Tabele danych są jednak przechowywane bardzo wydajnie - nawet jeśli lista elementów ma długość milionów mil, można ją łatwo dopasować i przetwarzać w ten sposób. Spróbuj taką linię:

dt = data.table(Start=1:1e6, End=1:1e6, Elements=1:1e6) 

dla demonstracji. Byłoby to z pewnością łatwiejsze w obsłudze niż zachowanie każdej listy elementów jako ciągu i dzielenie go za każdym razem.

+0

Nie zdawałem sobie sprawy, że zapisanie go jako listy joranów wspomnianej powyżej jest opcją. Teraz zapisuję go jako listę elementów numerycznych, co staje się łatwe do zrobienia. Dzięki za pomysł, nie wspomniałem nawet o długim formacie, dopóki nie wspomniałeś! – user1357015

Powiązane problemy