2016-05-02 8 views
1

Ich möchte eine Funktion auf jede Zeile eines Datenrahmens anwenden. Mit apply ist das Ergebnis selbst kein Datenrahmen mehr, es sieht eher wie eine Liste oder Matrix aus? (Ich weiß nicht genug R, um aus der Ausgabe zu ersehen, dass es kein Datenrahmen ist)R: apply-ähnliche Funktion, die einen Datenrahmen zurückgibt?

Welches ist die richtige Funktion, um eine Funktion auf jede Zeile einer Daten anzuwenden Rahmen, einen neuen Datenrahmen zurückgeben?

Die Funktion i auf jede Zeile angewendet werden soll:

map_uri <- function(request){ 
    ret <- request 
    uri_stem <- uri_map[uri_map[,1] == request["cs-uri-query"],2] 
    if(length(uri_stem) > 0){ 
     ret <- request 
     ret["cs-uri-stem"] <- uri_stem 
     ret["cs-uri-query"] <- "-" 
    } 
    if(request["cs-uri-stem"] == "/index.html"){ 
     ret["cs-uri-stem"] = "/" 
    } 

    return(ret) 

} 

, was ich versuche:

cleansed <- apply(requests, 1, map_uri) 
cleansed[,c("cs-uri-query", "cs-uri-stem")] 

, die mir den Fehler

Fehler in gereinigt [c gibt ("cs-uri-stem", "cs-uri-query")]: Indizierung außerhalb der Grenzen

(Index außerhalb der Grenzen)

Aus irgendeinem Grund sind die Strukturänderungen in einer Weise, die falsch über die Indizierung macht.

[Bearbeiten]

Daten dieses ein funktionierendes Beispiel zu machen:

uri_map.tsv http://pastebin.com/XhUuTMqA

uri_map <- read.table("http://pastebin.com/raw/XhUuTMqA", sep="\t", header=FALSE) 

und Eingangsdaten für die Transformationsfunktion:

http://pastebin.com/b7ja4rKn

Anfragen < - read.table ("http://pastebin.com/raw/b7ja4rKn", sep =““, header = TRUE)

+1

'apply' transponiert:' gelten (Matrix (1: 4, 2), 1, Identität) '. – Roland

+0

@Roland vielen Dank!Ist das nicht dokumentiert oder habe ich nicht sorgfältig genug gelesen? – kutschkem

+0

Es ist dokumentiert in 'help (" apply ")', aber etwas kryptisch. – Roland

Antwort

5

Sie können die Familie anwenden verwenden, aber Sie haben recht, das Ergebnis ist entweder ein matrix oder data.frame. Keine große Sache, aber zurück zu einem data.frame.

Ihre Funktion muss etwas konsistent über mehrere Spalten zurückzukehren (roh iris statt iris[, 1:4] würde unten nicht funktionieren, weil der iris$Species, die ein Faktor mit 3 Ebenen, wo summary kehrt 6 numerisch aus einer numerischen Spalte) und das ist, wo ein reproducible würde Hilfe. Unten habe ich iris und summary:

  1. gelten: as.data.frame(apply(iris[, 1:4], 2, summary))
  2. sapply: as.data.frame(sapply(iris[, 1:4], summary))
  3. lapply: do.call(cbind, lapply(iris[, 1:4], summary))
+0

Gibt es einen Grund, den du benutzt hast (*, 2, *) anstelle von 1? 1 ist Reihen und 2 ist Spalten, richtig? – kutschkem

+1

genau mein Kapitän –

Verwandte Themen