Frage

Ich arbeite mit einem großen Datenrahmen genannt exp ( Datei hier ) in R. im Interesse der Leistung, wurde vorgeschlagen, dass ich die idata.frame () Funktion von plyr überprüfen. Aber ich denke, ich verwende es falsch.

Mein ursprünglicher Anruf, langsam, aber es funktioniert:

df.median<-ddply(exp, 
                 .(groupname,starttime,fPhase,fCycle), 
                 numcolwise(median), 
                 na.rm=TRUE)

Mit idata.frame, Error: is.data.frame(df) is not TRUE

library(plyr)
df.median<-ddply(idata.frame(exp), 
                 .(groupname,starttime,fPhase,fCycle), 
                 numcolwise(median), 
                 na.rm=TRUE)

Also, ich dachte, vielleicht ist es meine Daten. Also habe ich versucht, die baseball Dataset. Das idata.frame Beispiel funktioniert gut: dlply(idata.frame(baseball), "id", nrow) Aber wenn ich etwas ähnliches wie meine gewünschten Anruf mit baseball versuchen, es funktioniert nicht:

bb.median<-ddply(idata.frame(baseball), 
                 .(id,year,team), 
                 numcolwise(median), 
                 na.rm=TRUE)
>Error: is.data.frame(df) is not TRUE

Vielleicht ist mein Fehler ist, wie ich die Gruppierungen bin spezifizieren? Wer weiß, wie mein Beispiel funktioniert?

ETA:

Ich habe auch versucht:

groupVars <- c("groupname","starttime","fPhase","fCycle")
voi<-c('inadist','smldist','lardist')

i<-idata.frame(exp)
ag.median <- aggregate(i[,voi], i[,groupVars], median)
Error in i[, voi] : object of type 'environment' is not subsettable

, die verwenden einen schnellen Weg, um die Mediane des Erhaltens, gibt aber einen anderen Fehler. Ich glaube nicht, ich verstehe, wie idata.frame überhaupt zu benutzen.

War es hilfreich?

Lösung

Angenommen, Sie arbeiten mit ‚großen‘ Daten und für perfomance suchen, scheint eine perfekte Passform für data.table.

Insbesondere die lapply(.SD,FUN) und .SDcols Argumente mit by

Setup der data.table

library(data.table)
DT <- as.data.table(exp)
iexp <- idata.frame(exp)

Welche Spalten numeric

numeric_columns <- names(which(unlist(lapply(DT, is.numeric))))



dt.median <- DT[, lapply(.SD, median), by = list(groupname, starttime, fPhase, 
    fCycle), .SDcols = numeric_columns]

einige Benchmarking

library(rbenchmark)
benchmark(data.table = DT[, lapply(.SD, median), by = list(groupname, starttime, 
    fPhase, fCycle), .SDcols = numeric_columns], 
 plyr = ddply(exp, .(groupname, starttime, fPhase, fCycle), numcolwise(median), na.rm = TRUE), 
 idataframe = ddply(exp, .(groupname, starttime, fPhase, fCycle), function(x) data.frame(inadist = median(x$inadist), 
        smldist = median(x$smldist), lardist = median(x$lardist), inadur = median(x$inadur), 
        smldur = median(x$smldur), lardur = median(x$lardur), emptyct = median(x$emptyct), 
        entct = median(x$entct), inact = median(x$inact), smlct = median(x$smlct), 
        larct = median(x$larct), na.rm = TRUE)), 
 aggregate = aggregate(exp[, numeric_columns],
                       exp[, c("groupname", "starttime", "fPhase", "fCycle")], 
              median), 
 replications = 5)

##         test replications elapsed relative user.self 
## 4  aggregate            5    5.42    1.789      5.30   
## 1 data.table            5    3.03    1.000      3.03    
## 3 idataframe            5   11.81    3.898     11.77       
## 2       plyr            5    9.47    3.125      9.45       

Andere Tipps

Seltsames Verhalten, aber auch in der Dokumentation heißt es, dass idata.frame experimentell. Sie fanden wahrscheinlich einen Fehler. Vielleicht könnten Sie den Scheck an der Spitze der ddply umschreiben, dass Tests is.data.frame ().

Auf jedem Fall diese Kürzungen etwa 20% der Zeit (auf meinem System):

system.time(df.median<-ddply(exp, .(groupname,starttime,fPhase,fCycle), function(x) data.frame(
inadist=median(x$inadist),
smldist=median(x$smldist),
lardist=median(x$lardist),
inadur=median(x$inadur),
smldur=median(x$smldur),
lardur=median(x$lardur),
emptyct=median(x$emptyct),
entct=median(x$entct),
inact=median(x$inact),
smlct=median(x$smlct),
larct=median(x$larct),
na.rm=TRUE))
) 

Shane fragte Sie in einem anderen Beitrag, wenn Sie die Ergebnisse Ihrer Skript-Cache könnte. Ich habe nicht wirklich eine Vorstellung von Ihrem Workflow, aber es kann am besten sein, ein chron Setup dies auszuführen und die Ergebnisse zu speichern, täglich / stündlich was auch immer.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top