idata.frame: Warum Fehler „is.data.frame (df) ist nicht wahr“?
-
09-10-2019 - |
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.
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.