2017-10-19 25 views
0

J'essaie d'obtenir des coordonnées GPS pour chaque espèce dans une trame de données de noms d'espèces donnée en utilisant une fonction spécifique au paquet (Red :: records) qui extrait les coordonnées d'une base de données contenant des informations à propos des distributions d'espèces.R: Pour l'erreur de copie de boucle

Ma Pour boucle est construite ci-dessous, où les itérations sont les nRow (noms) et les enregistrements de fonction renvoie les coordonnées lat/long:

for(i in 1:iterations){ 
    gbif[i,1] <- names[i,] ## grab names 

    try(temp1 <- records(names[i,])) 
    try(temp1$scientificName <- names[i,]) 

    try(temp2 <- merge(gbif, temp1, by.x="V1", by.y="scientificName")) 
    datalist[[i]] <- temp2 
} 

Après l'exécution de cette boucle, je suis en mesure d'obtenir des données pour les espèces ; cependant, il n'est pas correctement fusionné avec la liste de noms. Par exemple, appeler des enregistrements ("Agyneta flibuscrocus") renvoie correctement 5 coordonnées lat/long uniques alors que l'appel des enregistrements ("Agyneta mongolica") produit une erreur avec 0 enregistrements trouvés (ceci est valide pour chaque espèce).

Après cette boucle, je lie tous les enregistrements obtenus en une seule trame de données en utilisant:

dat = do.call(rbind, datalist) ## merge all occurrence data from GBIF into 
one data frame 
dat <- unique(dat) 

Quand je vais vérifier cette trame de données, je reçois les données exemple suivant:

Agyneta flibuscrocus  -115.58400  49.72 
Agyneta flibuscrocus  -117.58400  51.299 
... 
Agyneta mongolica   -115.58400  49.72 
Agyneta mongolica   -117.58400  51.299 

Ces réplications erronées sont également répétées dans le reste des 200 noms. En guise de note, j'ai tout enveloppé dans les instructions try parce que le code ne s'exécutera pas s'il s'exécute dans un enregistrement qui produit 0 résultats à partir de la base de données. Je sens que je suis en train de négliger quelque chose de très évident ici?

Reproductibles données & code:

install.packages("red") 
library(red) 

names = data.frame("Acantheis variatus", "Agyneta flibuscrocus", "Agyneta 
mongolica", "Alpaida alticeps", "Alpaide venilliae", "Amaurobius 
transversus", "Apochinomma nitidum") 

iterations = nrow(names) 
datalist = list() 

temp1 <- data.frame() ## temporary data frame for joining occurrence data 
from GBIF 

for(i in 1:iterations){ 
    gbif <- names[i,] ## grab name 

    try(temp1 <- records(gbif)) 
    try(temp1$V1 <- gbif) 

    datalist[[i]] <- temp1 

} 

dat = do.call(rbind, datalist) 
+1

S'il vous plaît fournir quelques exemples de données comme décrit [ici] (https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). –

+0

@tobiasegli_te Mon mauvais, merci de me garder en ligne :) –

Répondre

1

J'adapté certaines parties de votre script et maintenant il semble fonctionner correctement (avec vos données d'exemple la fonction ne récupère avec succès des données pour une espèce, celle qui a été répliqué dans votre code, mais ce n'est pas un problème de codage).

La raison principale des duplications erronées était la variable temp1 en cours de réutilisation. try(temp1 <- records(gbif)) a échoué mais try(temp1$V1 <- gbif) n'a pas, puisque les deux temp1 et gbif ont été définis (par erreur). Assurez-vous que les variables définies dans une itération d'une boucle ne sont pas reportées sur l'itération suivante.

iterations = nrow(myNames) 
datalist = list() 

for(i in 1:iterations){ 
    gbif <- myNames[i,] ## grab name 
    try_result <- try(records(gbif)) 
    if(class(try_result) != "try-error"){ 
     temp1 <- try_result 
     temp1$V1 <- gbif 
     datalist[[i]] <- temp1 
     rm(temp1) 
    }else{ 
     datalist[[i]] <- NA 
    } 
    rm(try_result) 
} 

dat <- do.call(rbind, datalist[!is.na(datalist)])