2017-10-19 3 views
0

私は、情報を含むデータベースから座標情報を引き出すパッケージ固有の関数(Red :: records)を使って、種名のデータフレーム内の各種のGPS座標情報を取得しようとしています種の分布について。R:Forループコピーエラー

私はforループ反復がnrow(名)であり、以下に構成されており、機能レコードは緯度/経度座標を返す:このループを実行した後

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 
} 

を、Iは、種のデータを取得することができる午前;ただし、ネームリストと適切にマージされません。たとえば、呼び出しレコード( "Agyneta flibuscrocus")は5つの固有の緯度/経度座標を正しく返しますが、呼び出しレコード(Agyneta mongolica)は0レコードのエラーを生成します(これはオンラインでチェックされたときに各種に対して有効です)。

このループの後、私が使用して単一のデータフレームに得られたレコードのすべてをバインドします

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

私は、このデータフレームを検証するために行くとき、私は次のサンプルデータを取得:

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

これらの誤った複製は、残りの200の名前でも繰り返されます。メモとして、データベースから0の結果を生成するレコードに実行された場合、コードは実行されないため、tryステートメントですべてをラップしました。

私はここで非常に明白な何かを見落としているように感じますか?

再生可能なデータ&コード:

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

記載されているようにいくつかの例のデータを入力してください[ここ](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。 –

+0

@tobiasegli_te私の悪い、私をラインに入れてくれてありがとう:) –

答えて

1

私はあなたのスクリプトの一部を適応し、今では正常に動作しているようです(あなたの例のデータと機能のみに成功の種、いずれかのデータを取得あなたのコードに複製されていますが、それはコーディングの問題ではありません)。

誤った重複の主な理由は、変数temp1が再利用されたためです。 temp1gbifの両方が(誤って)定義されているため、try(temp1 <- records(gbif))は失敗しましたが、try(temp1$V1 <- gbif)はありませんでした。ループの反復で定義された変数が次の反復に引き継がれないようにしてください。

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