R:用于循环复制错误

时间:2017-10-19 07:45:01

标签: r for-loop dataframe merge rbind

我尝试使用特定于包的函数(Red :: records)获取物种名称的给定数据框中每个物种的GPS坐标信息,该函数从包含物种分布信息的数据库中提取坐标信息。

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

执行此循环后,我能够获取物种的数据;但是,它没有与名单合适地合并。例如,调用记录(&#34; Agyneta flibuscrocus&#34;)正确返回5个唯一的纬度/经度坐标,同时调用记录(&#34; Agyneta mongolica&#34;)会产生错误,找到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结果的记录中,代码将不会执行。

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

可重复数据&amp;代码:

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 个答案:

答案 0 :(得分:1)

我修改了脚本的某些部分,现在它似乎正常工作(使用您的示例数据,该函数只能成功检索一个物种的数据,在您的代码中复制的数据,但这不是编码问题)。

错误重复的主要原因是变量temp1被重用。 try(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)])