2013-04-12 8 views
8

ich eine Datenstruktur in Form vonSpeichern einer Liste innerhalb eines Datenrahmenelement in R

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

In Worten erstellen möchten, Ich ziehe eine Kugel entlang einer Linie. Der "Start" steht für die linke Position des Balls und das "Ende" steht für die rechte Seite. Die "Elemente" bedeuten, dass ich diese Positionen irgendwie besonders finde. Was ist die beste Datenstruktur, wenn die Anzahl der Elemente sehr groß werden kann? Das einzige, was mir einfällt, ist ein Datenrahmen, in dem die dritte Spalte eine entsprechend formatierte Zeichenfolge ist. Ich müsste dann die Saite parsen, wenn ich jede Zahl im Set sehen wollte. Gibt es ein besseres Datenformat, das R hat oder ist?

Danke!

+2

Warum nicht nur eine Liste? – joran

+0

Eigentlich funktionierte das großartig und war einfach zu implementieren. Habe nicht erkannt, dass ein Datenrahmen eine Liste darin speichern kann. Perfekt, danke – user1357015

+0

warum nicht entweder @joran oder das OP post als Antwort? –

Antwort

12

Die Option in meinem Kommentar erwähnt, also einfach eine Liste für eine der Spalten mit:

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 

Sie könnten ganz natürlich auch Frames Graben Daten und einfach eine einfache alte Liste (welche verwenden könnten mehr machen Sinn in vielen Fällen sowieso):

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

und wenn Sie eine 'data.table' verwenden, können Sie alles in einer Zeile tun:' data.table (Start = 3: 4, Ende = c (6,10), Elemente = Liste (4: 5, 7 : 9)) ' – eddi

+2

@eddi Ja, aber dann müssen Sie ** data.table ** verwenden. : p – joran

+3

muss nicht, ** zu ** bekommen - wenn es nach mir ginge, gäbe es keine 'data.frame's mehr :) – eddi

6

Sie könnten es als einen hohen Datenrahmen statt als einen breiten Datenrahmen speichern und wahrscheinlich den data.table verwenden, um es effizient zu verarbeiten. Das heißt, eine Zeile pro Element machen, anstatt eine Zeile pro Start-End-Paar

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 

Dies würde Sie tut mehr Arten der Verarbeitung der Daten ganz leicht, wie die Bestimmung, wie viele Elemente in jedem Bereich sind:

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

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

Dies würde auch die Daten einfach für Grundstücke zu verwenden, mit dem ggplot-Paket, das in der Regel Daten in einem großen Format sein erwartet.

Sie könnten feststellen, dass diese Datenstruktur verschwenderisch ist, da sie für jedes Element den Anfang und das Ende wiederholt. Datentabellen werden jedoch sehr effizient gespeichert - selbst wenn Ihre Liste von Elementen buchstäblich Millionen lang ist, kann sie leicht auf diese Weise passen und verarbeitet werden. Versuchen Sie eine Zeile wie:

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

für eine Demonstration. Es würde sicherlich sein, schneller zu sein, als jede Elementliste als eine Zeichenkette zu behalten und es jedes Mal aufzuteilen.

+0

Ich wusste nicht, dass es eine Option ist, es als eine Liste wie joran oben zu speichern. Jetzt speichere ich es einfach als eine Liste von numerischen Elementen, die einfach zu machen ist. Danke für die Idee, ich habe nicht einmal an langes Format gedacht, bis du es erwähnt hast! – user1357015

Verwandte Themen