2011-10-23 4 views
4

J'essaie de tracer la courbe CDF pour un grand ensemble de données contenant environ 29 millions de valeurs en utilisant ggplot. La façon dont je suis informatique c'est comme ceci:Tracer uniquement un sous-ensemble des points?

mycounts = ddply(idata.frame(newdata), .(Type), transform, ecd = ecdf(Value)(Value)) 
plot = ggplot(mycounts, aes(x=Value, y=ecd)) 

Cela prend les âges à tracer. Je me demandais s'il y avait une façon propre de tracer seulement un échantillon de cet ensemble de données (par exemple, tous les 10e ou 50e point) sans compromettre le résultat réel?

Répondre

5

Je ne suis pas sûr de votre structure de données, mais un simple appel sample pourrait être suffisant:

n <- nrow(mycounts)        # number of cases in data frame 
mycounts <- mycounts[sample(n, round(n/10)), ] # get an n/10 sample to the same data frame 
+0

+1 Merci. Cela fonctionne parfait! – Legend

1

Au lieu de prendre toutes les n points -ème, pouvez-vous quantifiez vos données établies à un niveau suffisant résolution avant de le tracer? De cette façon, vous n'aurez pas à tracer une résolution dont vous n'avez pas besoin (ou que vous ne pouvez pas voir).

Voici une façon de le faire. (La fonction que j'ai écrit ci-dessous est générique, mais l'exemple utilise des noms de votre question.)

library(ggplot2) 
library(plyr) 

## A data set containing two ramps up to 100, one by 1, one by 10 

tens <- data.frame(Type = factor(c(rep(10, 10), rep(1, 100))), 
        Value = c(1:10 * 10, 1:100)) 


## Given a data frame and ddply-style arguments, partition the frame 
## using ddply and summarize the values in each partition with a 
## quantized ecdf. The resulting data frame for each partition has 
## two columns: value and value_ecdf. 

dd_ecdf <- function(df, ..., .quantizer = identity, .value = value) { 
    value_colname <- deparse(substitute(.value)) 
    ddply(df, ..., .fun = function(rdf) { 
    xs <- rdf[[value_colname]] 
    qxs <- sort(unique(.quantizer(xs))) 
    data.frame(value = qxs, value_ecdf = ecdf(xs)(qxs)) 
    }) 
} 


## Plot each type's ECDF (w/o quantization) 

tens_cdf <- dd_ecdf(tens, .(Type), .value = Value) 
qplot(value, value_ecdf, color = Type, geom = "step", data = tens_cdf) 



## Plot each type's ECDF (quantizing to nearest 25) 

rounder <- function(...) function(x) round_any(x, ...) 
tens_cdfq <- dd_ecdf(tens, .(Type), .value = Value, .quantizer = rounder(25)) 
qplot(value, value_ecdf, color = Type, geom = "step", data = tens_cdfq) 

Alors que les dataset d'origine et l'ensemble de ECDF avait 110 lignes, l'ensemble quantifiée-ECDF est très réduite:

> dim(tens) 
[1] 110 2 
> dim(tens_cdf) 
[1] 110 3 
> dim(tens_cdfq) 
[1] 10 3 
> tens_cdfq 
    Type value value_ecdf 
1  1  0  0.00 
2  1 25  0.25 
3  1 50  0.50 
4  1 75  0.75 
5  1 100  1.00 
6 10  0  0.00 
7 10 25  0.20 
8 10 50  0.50 
9 10 75  0.70 
10 10 100  1.00 

J'espère que cela aide! :-)

Questions connexes