El problema es que no puede cargar todos los datos en la memoria. Entonces podría hacer un muestreo de los datos, como lo indicó anteriormente @Marek. En conjuntos de datos tan grandes, obtienes esencialmente los mismos resultados, incluso si solo tomas el 1% de los datos. Para la trama de violín, esto le dará una estimación decente de la densidad. El cálculo progresivo de los cuantiles es imposible, pero esto debería dar una aproximación muy decente. Es esencialmente lo mismo que el "método aleatorio" descrito en el enlace @aix dio.
Si no puede subconjunto la fecha fuera de R, se puede hacer usando conexiones en combinación con sample()
. La siguiente función es la que uso para muestrear los datos de un marco de datos en formato de texto cuando se está haciendo demasiado grande. Si juegas un poco con la conexión, puedes convertirla fácilmente en una conexión de socket u otra para leerla desde un servidor, una base de datos, lo que sea. Solo asegúrate de abrir la conexión en el modo correcto.
Bien, toma un simple.csv, a continuación, siguiendo las muestras de función una fracción p de los datos:
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)
}
Un ejemplo del uso:
#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")
¿Qué significa exactamente "muy grande" en su caso? – radek
@radek: "Todos los datos no pueden caber en la memoria" parece una buena aproximación de "demasiado grande para que R lo maneje". Si realmente es 2Gb o 20Gb en realidad ya no importa, ¿verdad? –
@ Joris A menos que OP tenga memory.limit demasiado pequeño o muchas columnas innecesarias o algo más. Esta información podría ser relevante. – Marek