Wie zu verwenden übernehmen, um generieren eines Daten-frame zeilenweise?

Ich will erzeugen einen dataframe Zeile für Zeile, mit einigen Geschmack von apply auf eine Liste von Werten und eine Funktion zurückgibt, die einen single-row data-frame für jeden Wert. Als Spielzeug angenommen, dass meine Werte sind i = 1:3 sind, und dass ich:

f <- function(i) {
    return(data.frame(img=letters[i], cached=F, i=i, stringsAsFactors=F))
}

Ich ve wurde Herumspielen mit sapply, lapply eine Reihe von transpose etc. ohne Erfolg (zum Beispiel d = sapply(1:3, f) sieht vielversprechend aus, scheint aber das transponieren von dem, was ich will, so habe ich versucht d = t(sapply(1:3,f)), außer dass es ein matrix; ich habe daher versucht, neben d = as.data.frame(t(sapply(1:3, f))), die erscheint rechts (er druckt genau wie das, was ich will), aber ist immer noch falsch, so, als würden Sie erfahren, wenn Sie versuchen, Teilmenge, um es z.B. d[,1] ist in der Tat eine Liste).

Endlich bekam ich das, was funktioniert:

d = apply(data.frame(i=1:3), 2, f)$i

Gibt mir den Rahmen, ich wollte:

  img cached i
1   a  FALSE 1
2   b  FALSE 2
3   c  FALSE 3

Gibt es eine bessere/sauberere Weg, drücken Sie die oben? Es fühlt sich alles ziemlich notdürftigem und übermäßig kompliziert für mich.


Bearbeiten: wie bereits erwähnt, durch verschiedene Leserinnen und Leser, dieses "Spielzeug-Beispiel" ist admitedly zu einfach, und in der Tat nur f(1:3) tun würde, was es sieht aus wie ich bin anfordern. Die eigentliche Funktion ist Teil eines web-basierten Metriken dashboard, zieht Daten aus verschiedenen DB-Tabellen, und macht mäßig komplexe plots, die ich beabsichtige in den cache (die meisten der Zeit, Sie verändern sich relativ langsam). Der relevante Teil, ich denke, ist, dass die Funktion dauert normalerweise mehrere Argumente und diese Argumente sind nicht eine einfache Abfolge 1:n. Also, lassen Sie mich schreiben, die so ein bisschen realistischer:

library(digest)
gkey   <- function(...) {
  args <- list(...)
  return(digest(paste(args,sep=".",collapse=".")));
}

f <- function(conn, table, checknew.query, plot.query, plot.fun, params) {
  latest.data = queryExec(conn, table, checknew.query, params)
  key = gkey(table, latest.data, plot.query, plot.fun, params)
  out = getFromCacheOrPlot(key, conn, table, plot.query, plot.fun, params)
  return(out)
}

wo queryExec baut eine Abfrage, führt Sie aus und ruft die Ergebnisse gkey() berechnet einen hash-Schlüssel auf Basis Ihrer Parameter getFromCacheOrPlot() verwendet die key um eine Datei zu erstellen namens (ein .png-Bild), ruft es aus dem cache, wenn es vorhanden ist, oder erzeugt es anders. Es gibt auch eine Daten.Rahmen mit einer Zeile geben Sie uns den Namen der Datei, eine html - <img=...> Klappentext, um es anzuzeigen, ob das Grundstück wurde in-oder out-of-cache, und welche Parameter verwendet wurden, die für die Handlung.

Dies alles in ein plugin für ein wiki-system, und einige Seiten haben Dutzend Parzellen oder mehr.

  • do.call(rbind, lapply(i, f)) tun, was Sie Fragen... aber so würde data.frame(img=letters[i], cached=F, i=i, stringsAsFactors=F)... also ich denke, ich bin nicht sicher, was Sie gefragt haben.
  • Ich glaube, Sie brauchen ein Spielzeug Beispiel, dass mehr genau stellt Ihr wirklich Problem, da meine unmittelbare Reaktion wäre, einfach das zu tun data.frame(img = letters[i],cached = rep(FALSE,length(i)),i = i) und ich vermute, dass ist nicht das, was Sie suchen.
  • oder, da du bereits die Funktion f: f(i) produzieren Daten.Rahmen zu.
  • fair genug, dem Spielzeug-Beispiel ist zu einfach. Die eigentliche Funktion ist Teil eines web-basierten dashboard und stellt sogar komplizierte Handlung mit Hilfe einer Datenbank-Verbindung. Die Parzellen sind in der Regel-Cache auf der Festplatte, und brauchen nicht neu gerendert, abhängig von bestimmten Bedingungen (beschlossen von der Funktion der Logik). Also, ich brauche, um das Spielzeug Beispiel ein bisschen mehr realistisch, nehme ich an.
  • gleichen Kommentar.
  • Ihre Methode scheint ziemlich gut zu mir, aber ich finde do.call(rbind, lapply(i, f)) irgendwie klarer ...
  • Wenn ich mit sapply ich oft angeben simplify = FALSE Form und meine Daten von hand (mit do.call).
  • danke, mir gefällt die Lösung. Könntest du oder Justin poste es bitte als Antwort, damit ich das annehmen kann?
  • Ich denke, Priorität geht an @Justin 😉
  • Ich möchte hervorheben, Ihre Anregung. Ich im Grunde immer tun, wie gut. simplify=TRUE kann wirklich schädlich insbesondere in Bezug auf Grenzfälle (z.B. eine Spalte wird ein Vektor...), weil Sie sich nicht sicher sind das Ergebnis...

InformationsquelleAutor Pierre D | 2013-01-15
Schreibe einen Kommentar