为什么我在循环打印与write.csv的R中获得不同的结果

时间:2018-04-16 20:00:05

标签: r csv for-loop

我试图在R中编写我的第一个for循环。循环应该读取物种列表,确定每个物种的AUC和Kappa值,然后写入.csv文件的数据。

现在我已经省略了代码的Kappa部分以简化。代码运行正常,但我到csv文件的输出是我列表中的最后一个物种,相应的AUC重复了15次。

相反,如果我运行print(i)和print(AUC),我会得到每个物种的列表和相应的AUC。我不明白为什么printwrite.csv没有给我相同的结果。

setwd("Y:/HModel/Maxent/MaxentOutputs/allspp 11-28")
splist <-c( "pomatomus_saltatrix",
            "stenotomus_chrysops",
            "illex_illecebrosus",
            "lophius_americanus",
            "squalus_acanthias",
            "scophthalmus_aquosus",
            "paralichthys_dentatus",
            "helicolenus_dactylopterus",
            "merluccius_albidus",
            "merluccius_bilinearis",
            "urophycis_chuss",
            "cynoscion_regalis",
            "pollachius_virens",
            "urophycis_tenuis",
            "tautogolabrus_adspersus")

n = rep(NA, length(splist))
AUCandKAPPA = data.frame(sppocean=n, AUC=n, stringsAsFactors=FALSE)

for (i in splist) {
  presence_csv <- paste(i,"0", "samplePredictions.csv", sep = "_")
  background_csv <- paste(i, "0", "backgroundPredictions.csv", sep = "_")

  presence <- read.csv(presence_csv)
  background <- read.csv(background_csv)

  pp <- presence$Logistic.prediction # get the column of predictions
  testpp <- pp[presence$Test.or.train=="test"] # select only test points
  trainpp <- pp[presence$Test.or.train=="train"] # select only test points
  bb <- background$Logistic

  combined <- c(testpp, bb) # combine into a single vector
  label <- c(rep(1,length(testpp)),rep(0,length(bb))) # labels: 1=present, 0=random
  pred <- prediction(combined, label) # labeled predictions
  perf <- performance(pred, "tpr", "fpr") # True / false positives, for ROC curve
  AUC <-performance(pred, "auc")@y.values[[1]] # Calculate the AUC

  # fill in diagnostics
  AUCandKAPPA$sppocean = i 
  AUCandKAPPA$AUC = AUC
  print(i)
  print(AUC)

  # write AUC and kappa to excel file
  write.csv(AUCandKAPPA, file="kappa_sp1-28.csv")
}

我尝试更改以下行,但收到​​错误

# fill in diagnostics
  AUCandKAPPA$sppocean[i] = i
  AUCandKAPPA$AUC[i] = AUC

Error in `$<-.data.frame`(`*tmp*`, "sppocean", value = c("15", "pomatomus_saltatrix" : 
  replacement has 2 rows, data has 1

1 个答案:

答案 0 :(得分:1)

您尝试的改变是朝着正确方向迈出的一步。您已经注意到您的循环在每次迭代时都会覆盖结果。但由于您通过splist中的字符串控制循环,因此无法使用AUCandKappa对数据框i建立索引。也许用数字索引控制你的循环:

for(i in 1:length(splist)) {}

调整依赖splist分配给i的字符的所有代码,以便通过splistsplist[i]中提取。

然后将结果分配给您的表格:

# fill in diagnostics
AUCandKAPPA[i, "sppocean"] <- splist[i]
AUCandKAPPA[i, "AUC"] <- AUC