2017-08-07 2 views
1

Ich denke vielleicht zu sehr darüber nach oder denke nicht genug nach. Kann nicht entscheiden, welche. Ich benutze das Paket (BBMM), um Bewegungsmodelle für Wildtiere mit x, y Koordinaten und Zeitverzögerung zu konstruieren (wie es die Funktion browian.bridge() in BBMM erfordert).Anwenden der Funktion, wenn die Spalte den Anforderungen entspricht

Mein Problem ist, dass die Funktion auf einer einzelnen Person gleichzeitig arbeitet. Ich habe einen Datenrahmen (Schaf) mit mehr als 20 Personen, die von einer ID bezeichnet (CollarSerialNumber) wie unten dargestellt:

Schafe

 CollarSerialNumber EASTING NORTHING Time.lag 
1     37434 824635.2 2186799  0 
2     37434 824640.5 2186798  360 
3     37434 824644.8 2186791  360 
4     37434 824668.9 2186739  360 
5     37434 824637.6 2186786  360 
6     37435 824640.7 2186787  360 
7     37435 824648.1 2186784  360 
8     37435 824653.3 2186789  360 
9     37435 824644.7 2186797  360 
10     37435 824640.5 2186800  360 
11     37436 824637.5 2186791  360 
12     37436 824637.5 2186791  360 
13     37436 824647.8 2186800  360 
14     37436 824644.7 2186796  360 
15     37436 824637.6 2186787  360 
16.... 

Die Funktion sieht wie folgt aus:

brownian.bridge(x, y, time.lag, location.error, cell.size) 

x, y und time.lag werden vom Datenrahmen geliefert und die anderen beiden werden manuell eingegeben. Es sieht so aus:

BBMMID=brownian.bridge(x=sheep$Easting, y=sheep$Northing, 
         time.lag=sheep$Time.lag[-1], 
         location.error=20, cell.size=30) 

Die Funktion funktioniert einwandfrei, wenn der Datenrahmen nur eine ID enthält. Ich habe meine gesamte CSV-Datei genommen und sie in mehr als 20 separate CSV-Dateien basierend auf der ID aufgeteilt (eine für 37434, 37435, etc.) und das funktioniert gut. Der Prozess ist jedoch langwierig und zeitaufwendig. Ich suche nach einer Möglichkeit, Funktionen über eine Reihe von Zeilen anzuwenden, wenn die Spalte eine bestimmte Anforderung erfüllt.

Zum Beispiel, wenn ich diese Funktion auf JUST 37434 innerhalb des gesamten Datenrahmens anwenden möchte, ohne Dinge in Excel zu brechen (ich bin nicht sehr erfahren mit Code, wenn Sie nicht bereits wissen!) Wie würde ich darüber gehen? Wäre das ein Wenn-Dann-Problem? Eine Anwendungsfunktion? Teilsetzung?

+0

Die'Anwenden'-Funktion scheint die beste Option zu sein. Sie können die 'brownian.bridge' in eine benutzerdefinierte Funktion einfügen. Diese Funktion würde sowohl den Datenrahmen als auch das, was Sie wollen, unterteilen. – Kevin

+0

der Fall ist nicht das gleiche in Daten und Beispiel, ist es ein Fehler in der Post oder in Ihrem Code? –

+0

Wo wird * CollarSerialNumber * in diese Funktion eingefügt? Oder mit anderen Worten: Woher weißt du, dass es nur für eine ID funktioniert? – Parfait

Antwort

0

Betrachten by eine Liste von brownian.bridge Ausgängen gleich unterschiedliche Anzahl von CollarSerialNumber auszugeben. Als Info, ?by Scheiben Ihre Datenrahmen von ausgewähltem Faktor (n) und übergibt einen Datenrahmen zu jedem Faktor Wert gefiltert in seine FUN Aufruf:

objList <- by(sheep, sheep$collarSerialNumber, FUN=function(df) 
       brownian.bridge(x=df$Easting, y=df$Northing, 
           time.lag=df$Time.lag[-1], 
           location.error=20, cell.size=30)) 

Für den Zugriff auf erstes Objekt in objList entweder Nummer oder den Namen Referenz verwenden:

objList[[1]] 

objList$`37434` 
+0

by() scheint die Funktion zu sein, nach der ich gesucht habe, danke! –

+0

Hat die Lösung funktioniert? Es gibt ein Häkchen auf der Seite, um es uns zu sagen. – Parfait

+0

Es tat, danke. Das war die erste Frage, die ich gestellt habe, daher kenne ich das Verfahren nicht. Ich schätze das Fachwissen! –

Verwandte Themen