2017-10-19 65 views
0

我试图从包含信息的数据库中获取坐标信息的包特定函数(Red :: records)获取物种名称给定数据框中每个物种的GPS坐标信息关于物种分布。R:For Loop复制错误

我的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 
} 

执行这个循环之后,我能够获得品种数据;但是,它不适合与名单合并。例如,调用记录(“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个名称的其余部分重复。作为附注,我将所有内容都包含在try语句中,因为如果代码运行到从数据库中产生0结果的记录中,代码将不会执行。

我觉得我在这里忽略了一些非常明显的东西?

重复性的数据&代码:

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

我适应你的脚本的某些部分,现在它似乎正常工作(与您的示例数据的功能,只有成功地检索数据的一个品种,一个被复制到你的代码中,但这不是一个编码问题)。

错误重复的主要原因是重复使用变量temp1try(temp1 <- records(gbif))失败,但try(temp1$V1 <- gbif)没有,因为(错误地)定义了temp1gbif。确保循环迭代中定义的变量不会转移到下一次迭代。

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