Kreślenie bardzo dużych zbiorów danych w R

Jak wykreślić bardzo duży zbiór danych w R?

Chciałbym użyć boxplot, lub fabuła skrzypiec, lub podobne. Wszystkie dane nie mogą zmieścić się w pamięci. Czy Mogę stopniowo czytać i obliczać streszczenia potrzebne do tych działek? Jeśli tak, to w jaki sposób?

Author: Daniel Arndt, 2010-12-03

7 answers

W uzupełnieniu do mojego komentarza do Dmitri answer , funkcja do obliczania kwantyli za pomocą ff big-data handling package:

ffquantile<-function(ffv,qs=c(0,0.25,0.5,0.75,1),...){
 stopifnot(all(qs<=1 & qs>=0))
 ffsort(ffv,...)->ffvs
 j<-(qs*(length(ffv)-1))+1
 jf<-floor(j);ceiling(j)->jc
 rowSums(matrix(ffvs[c(jf,jc)],length(qs),2))/2
}

Jest to dokładny algorytm, więc używa sortowania -- a więc może zająć dużo czasu.

 10
Author: mbq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:30:11

Problem polega na tym, że nie można załadować wszystkich danych do pamięci. Można więc zrobić samplowanie danych, o czym wcześniej wspomniał @Marek. Na tak ogromnych zestawach danych uzyskujesz zasadniczo takie same wyniki, nawet jeśli weźmiesz tylko 1% danych. W przypadku fabuły skrzypiec da to przyzwoite oszacowanie gęstości. Progresywne obliczanie kwantyli jest niemożliwe, ale powinno to dać bardzo przyzwoite przybliżenie. Jest to zasadniczo to samo, co" metoda randomizowana " opisana w linku @ aix dał.

Jeśli nie można podzestawić daty poza R, można to zrobić za pomocą połączeń w połączeniu z sample(). Następująca funkcja jest tym, czego używam do próbkowania danych z ramki danych w formacie tekstowym, gdy robi się zbyt duży. Jeśli grasz trochę z połączeniem, możesz łatwo przekonwertować to na socketConnection lub inne, aby odczytać je z serwera, bazy danych, cokolwiek. Po prostu upewnij się, że połączenie zostało otwarte we właściwym trybie.

Dobrze, weź proste .pliku csv, następnie po funkcja pobiera ułamek p danych:
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)
}

Przykład użycia:

#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")
 8
Author: Joris Meys,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-03 18:24:01

Powinieneś również spojrzeć na pakiety RSQLite, SQLiteDF, RODBC i biglm. Dla dużych zbiorów danych is może być przydatne do przechowywania danych w bazie danych i ciągnąć tylko kawałki do R. bazy danych mogą również zrobić sortowanie dla Ciebie i wtedy obliczanie kwantyli na posortowanych danych jest znacznie prostsze (wtedy wystarczy użyć kwantyli zrobić wykresy).

Istnieje również Pakiet hexbin (bioconductor) do robienia odpowiedników scatterplot z bardzo dużymi zbiorami danych (prawdopodobnie nadal chcesz użyć próbki danych, ale działa z dużą próbką).

 4
Author: Greg Snow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-03 17:55:19

Możesz umieścić dane w bazie danych i obliczyć kwantyle za pomocą SQL. Zobacz: http://forge.mysql.com/tools/tool.php?id=149

 4
Author: Matti Pastell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-03 18:02:03

Wszystko, czego potrzebujesz do boxplot to kwantyle," wąsy " ekstremalne i odstające (jeśli pokazane), które są łatwo wstępnie obliczone. Spójrz na funkcję boxplot.stats.

 3
Author: Dmitri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-03 02:56:09

Możesz tworzyć wykresy z zarządzalnej próbki danych. Na przykład jeśli używasz tylko 10% losowo wybranych wierszy, boxplot na tej próbce nie powinien różnić się od all-data boxplot.

Jeśli Twoje dane są w jakiejś bazie danych, możesz stworzyć jakąś losową flagę (jak Wiem, prawie każdy silnik bazy danych ma jakiś generator liczb losowych).

Druga sprawa to jak duży jest Twój zbiór danych? Do boxplot potrzebne są dwie kolumny: zmienna wartości i zmienna grupy. To przykład:
N <- 1e6
x <- rnorm(N)
b <- sapply(1:100, function(i) paste(sample(letters,40,TRUE),collapse=""))
g <- factor(sample(b,N,TRUE))
boxplot(x~g)

Potrzebuje 100MB pamięci RAM. If N=1e7 then it uses

 2
Author: Marek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-03 09:59:19

To ciekawy problem.

Boxplots wymagają kwantyli. Obliczanie kwantyli na bardzo dużych zbiorach danych jest trudne.

Najprostszym rozwiązaniem, które może, ale nie musi działać w Twoim przypadku jest downsampling danych w pierwszej kolejności, i produkować wykresy próbki. Innymi słowy, odczytaj kilka rekordów na raz i zachowaj ich podzbiór w pamięci (wybierając deterministycznie lub losowo.) Na koniec twórz wykresy na podstawie danych, które zostały zachowane w pamięci. Ponownie, czy lub nie jest to wykonalne bardzo zależy od właściwości danych.

Alternatywnie istnieją algorytmy, które mogą ekonomicznie i w przybliżeniu obliczać kwantyle w sposób "online", co oznacza, że są one przedstawiane z jedną obserwacją na raz, a każda obserwacja jest wyświetlana dokładnie raz. Chociaż mam pewne ograniczone doświadczenie z takimi algorytmami, nie widziałem żadnych łatwo dostępnych implementacji R.

W poniższym artykule przedstawiono krótki przegląd niektórych odpowiednie algorytmy: Kwantyle na strumieniach .

 2
Author: NPE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-03 10:18:00