Im Allgemeinen versuche ich verwenden apply(), so dass die Verarbeitung einer Zeile von den Ergebnissen der zuvor verarbeiteten Zeilen abhängt.R apply() - Wie trage ich Informationen über Schleifen?
This post ist verwandt, aber hat mir nicht geholfen, die Ergebnisse zu erstellen.
Ich möchte einen Datenrahmen von einzigartigen "locations
" aus einem Datenrahmen von incidents
erstellen. Die Vorfälle werden mit Geokoordinaten (lon, lat) registriert. Ich habe die Vorfälle von lon
und lat
sortiert, dann durchlaufen sie nacheinander mit apply()
. Als Ergebnis möchte ich etwas wie expectedResult bekommen. Ich überprüfe, ob die Geokoordinaten eines Vorfalls den Geokoordinaten eines zuvor bearbeiteten entsprechen. Wenn dies nicht der Fall ist, erstelle ich einen neuen Standort. Wenn dem so ist, nehme ich an, der Vorfall ereignete sich am selben Ort.
Mein Problem ist, dass ich nicht weiß, wie man den Datenrahmen/die Liste von Standorten erstellt, wenn die Funktion auf Vorfälle angewendet wird. Bevor ich die Funktion checkEquals
für Vorfälle anwende, erstelle ich einen initialen Datenrahmen locations
, der den ersten Standort enthält.
In meinen Beispieldaten ist Zeile 3 absichtlich ein Duplikat von 1, sodass mindestens diese Vorfälle an denselben Speicherort hinzugefügt werden sollen.
checkEquals <- function(row,loc){
prevLoc <- loc[nrow(loc),]
if (as.numeric(row["lon"]) == as.numeric(prevLoc["lon"])
&& as.numeric(row["lat"]) == as.numeric(prevLoc["lat"])) {
# if (row == prevLoc) {
prevLoc["count"] <- as.numeric(prevLoc["count"]) + 1
loc[nrow(loc),] <- prevLoc
} else {
loc[nrow(loc)+1,] <- c(row["id"], row["lon"], row["lat"],count=1)
}
locations <<- loc
}
main <- function(){
incidents <- data.frame(id = c(1,2,3,4), lon = c(-81, -80, -81, -79), lat = c(42, 40, 42, 41))
incidents <- incidents[order(incidents$lon, incidents$lat),]
locations <- data.frame(id=1,lon=incidents[1,]$lon, lat=incidents[1,]$lat, count=0)
locations <- apply(incidents,1,checkEquals,locations)
print(locations)
expectedResult <- data.frame(id = c(1,2,4), lon = c(-81, -80, -79), lat = c(42, 40, 41), count = c(2,1,1))
print(expectedResult)
}
> main()
$`1`
id lon lat count
1 1 -81 42 1
$`3`
id lon lat count
1 1 -81 42 1
$`2`
id lon lat count
1 1 -81 42 0
2 2 -80 40 1
$`4`
id lon lat count
1 1 -81 42 0
2 4 -79 41 1
> expectedResult
id lon lat count
1 1 -81 42 2
2 2 -80 40 1
3 4 -79 41 1
In jeder Iteration des apply()
vergleicht das Programm gegenüber dem anfänglichen locations
. Ich möchte locations
mit jeder Iteration ändern, Zeilen hinzufügen oder vorhandene ändern. Offenbar macht die finale Zuweisung locations <<- loc
nicht den Trick, noch explizite assign()
. Darüber hinaus gibt es immer noch die Formatierungsprobleme von Speicherorten, bei denen es sich um eine Liste von Datenrahmen und nicht um einen Datenrahmen handelt.
Bitte lesen Sie tun könnte [wie kann ich eine gute Frage stellen] (http://stackoverflow.com/help/how-to-ask) [Wie ein MCVE erstellen] (http://stackoverflow.com/help/mcve) sowie [wie man ein minimales reproduzierbares Beispiel in R zur Verfügung stellt] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r -reproducible-Beispiel # antwort-5963610). Ich schlage vor, dass Sie Ihre Frage bearbeiten und minimale Dummy-Eingabedaten angeben, die von Ihrem spezifischen Problem und der erwarteten Ausgabe abstrahieren. – lukeA
Die überarbeitete Frage ist mit ihren Beispieldaten reproduzierbar und, ich denke, klar genug. Das Problem bleibt offen. –
Vorfälle [! Dupliziert (Vorfälle [, 2: 3]),] gibt Ihnen 'expectedResult'. – lukeA