4 Stimmen

Nur eine Teilmenge der Punkte aufzeichnen?

Ich versuche, die CDF-Kurve für einen großen Datensatz mit etwa 29 Millionen Werten mit ggplot zu zeichnen. Die Art und Weise, wie ich dies berechne, ist wie folgt:

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

Es dauert ewig, dies zu planen. Ich frage mich, ob es eine saubere Möglichkeit gibt, nur eine Stichprobe dieses Datensatzes (z. B. jeden 10. oder 50. Punkt) darzustellen, ohne das eigentliche Ergebnis zu beeinträchtigen?

5voto

daroczig Punkte 27061

Ich bin mir über Ihre Datenstruktur nicht sicher, aber eine einfache sample könnte ein Anruf genügen:

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

1voto

Tom Moertel Punkte 73

Anstatt jede n -Punkt: Können Sie Ihren Datensatz auf eine ausreichende Auflösung herunterquantisieren, bevor Sie ihn grafisch darstellen? Auf diese Weise müssen Sie keine Auflösung darstellen, die Sie nicht benötigen (oder nicht sehen können).

Hier ist eine Möglichkeit, wie Sie das tun können. (Die Funktion, die ich unten geschrieben habe, ist generisch, aber das Beispiel verwendet Namen aus Ihrer Frage).

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)

Während der ursprüngliche Datensatz und der ecdf-Satz 110 Zeilen umfassten, ist der quantisierte ecdf-Satz wesentlich kleiner:

> 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

Ich hoffe, das hilft! :-)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X