Problem ist, dass Sie nicht alle Daten in den Speicher laden können. Sie können also, wie bereits von @Marek angezeigt, Stichproben der Daten durchführen. Auf solch riesigen Datensätzen erhalten Sie im Wesentlichen die gleichen Ergebnisse, selbst wenn Sie nur 1% der Daten verwenden. Für den Violin-Plot erhalten Sie eine ordentliche Schätzung der Dichte. Eine progressive Berechnung von Quantilen ist unmöglich, aber dies sollte eine sehr gute Annäherung ergeben. Es ist im Wesentlichen das gleiche wie die "randomisierte Methode", die im Link @aix beschrieben wurde.
Wenn Sie das Datum nicht außerhalb von R subset- zen können, kann dies über Verbindungen in Kombination mit sample()
geschehen. Folgende Funktion verwende ich, um Daten von einem Datenrahmen im Textformat zu erfassen, wenn es zu groß wird. Wenn Sie ein wenig mit der Verbindung spielen, könnten Sie dies leicht in eine socketConnection konvertieren, um sie von einem Server oder einer Datenbank zu lesen. Stellen Sie sicher, dass Sie die Verbindung im richtigen Modus öffnen.
Gut, nimm ein einfaches.CSV-Datei, dann Proben folgende Funktion ein Bruchteil p der Daten:
sample.df <- function(f,n=10000,split=",",p=0.1){
con <- file(f,open="rt",)
on.exit(close(con,type="rt"))
y <- data.frame()
#read header
x <- character(0)
while(length(x)==0){
x <- strsplit(readLines(con,n=1),split)[[1]]
}
Names <- x
#read and process data
repeat{
x <- tryCatch(read.table(con,nrows=n,sep=split),error = function(e) NULL)
if(is.null(x)) {break}
names(x) <- Names
nn <- nrow(x)
id <- sample(1:nn,round(nn*p))
y <- rbind(y,x[id,])
}
rownames(y) <- NULL
return(y)
}
Ein Beispiel für die Nutzung:
#Make a file
Df <- data.frame(
X1=1:10000,
X2=1:10000,
X3=rep(letters[1:10],1000)
)
write.csv(Df,file="test.txt",row.names=F,quote=F)
# n is number of lines to be read at once, p is the fraction to sample
DF2 <- sample.df("test.txt",n=1000,p=0.2)
str(DF2)
#clean up
unlink("test.txt")
Was genau bedeutet "sehr groß" in Ihrem Fall? – radek
@radek: "Alle Daten können nicht in den Speicher passen" scheint eine gute Annäherung an "viel zu groß für R" zu sein. Ob es 2Gb oder 20Gb ist spielt keine Rolle mehr, oder? –
@Joris Es sei denn OP hat memory.limit zu klein oder viele unnötige Spalten oder etwas anderes. Diese Information könnte relevant sein. – Marek