2017-08-07 4 views
1

Je pense peut-être trop à ce sujet ou je n'y pense pas assez. Je ne peux pas décider lequel. J'utilise le package (BBMM) pour construire des modèles de mouvement pour la faune en utilisant les coordonnées x, y et le décalage temporel (comme requis par la fonction brownian.bridge() dans BBMM).Application de la fonction si la colonne correspond aux exigences

Mon problème est que la fonction fonctionne sur un individu à la fois. J'ai comme indiqué ci-dessous une trame de données (moutons) avec plus de 20 personnes désignées par un ID (CollarSerialNumber):

moutons

 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.... 

La fonction ressemble à ceci:

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

x, y et time.lag sont fournis par le bloc de données et les deux autres sont entrés manuellement. Cela ressemble à ceci:

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

La fonction fonctionne correctement lorsque la trame de données comprend un seul ID. J'ai pris mon fichier csv entier et le diviser en 20 fichiers séparés csv en fonction de l'ID (un pour 37434, 37435, etc.) et cela fonctionne très bien. Le processus, cependant, est fastidieux et prend du temps. Je cherche un moyen d'appliquer des fonctions sur un ensemble de lignes si la colonne correspond à une certaine exigence. Par exemple, si je veux appliquer cette fonction à JUST 37434 dans tout le bloc de données sans avoir besoin de casser les choses dans Excel (je ne suis pas très expérimenté avec le code, si vous ne pouvez pas déjà dire!) j'irais à ce sujet? Serait-ce un problème si-alors? Une fonction d'application? Sous-cotation?

+0

La fonction 'apply' semble être la meilleure option. Vous pouvez envelopper le 'brownian.bridge' dans une fonction personnalisée. Cette fonction prendrait le cadre de données ainsi que tout ce que vous voulez le sous-estimer. – Kevin

+0

le cas n'est pas le même dans les données et l'exemple, est-ce une erreur dans la poste ou dans votre code? –

+0

Où dans cette fonction se trouve * CollarSerialNumber * qui lui est passé? Ou en d'autres termes, comment savez-vous que cela ne fonctionne que pour une identification? ( – Parfait

Répondre

0

Tenir compte by pour produire une liste des sorties brownian.bridge égal au nombre distinct de CollarSerialNumber. Infos, ?by tranches votre dataframe par le facteur sélectionné (s) et passe une trame de données filtrée à chaque valeur du facteur dans son FUN appel:

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)) 

Pour accéder au premier objet OBJLIST utiliser soit numéro ou référence nom:

objList[[1]] 

objList$`37434` 
+0

par() semble être la fonction que je cherchais, merci! –

+0

Alors, la solution a-t-elle fonctionné? Il y a une coche à côté pour nous le dire. – Parfait

+0

C'est fait, merci. C'était la première question que j'ai posée, donc je ne connais pas la procédure. J'apprécie l'expertise! –