繁体   English   中英

如何使用 for 循环在 R 中基于两个现有数据框创建数据框列表?

[英]How do I use a for loop to create a list of data frames, based off two existing data frames, in R?

我对循环非常陌生。 我的一些循环是成功的,其他的……不是那么多。

我有一些观察到的数据 (df_obs),我想用我的模型预测 (df_pred) 进行测试。

我的当前目标:编写一个循环来制作数据框列表,以便我可以在未来的循环中使用这个列表来评估模型性能。 我可能会回来寻求帮助这些循环......

是:我确实想要一个数据框列表。 我正在研究 50 多个物种,并且有一堆测试要对这些值运行。

可能:我想我想要一个 for() 循环,但如果使用不同的方法更容易,例如 lapply(),我愿意接受建议。

我已尽力创建一个可重现的数据集和代码来模仿我正在使用的内容:

#observed presence (1) and absence (0)
set.seed(733)
df_obs <- data.frame(plot = 1:10,
                    sp1 = sample(0:1, 10, replace = TRUE),
                    sp2 = sample(0:1, 10, replace = TRUE),
                    sp3 = sample(0:1, 10, replace = TRUE))

#predicted probability of occurrence (ranges from 0 to 1)
set.seed(733)
df_preds <- data.frame(plot = 1:10,
                       sp1 = runif(10, 0, 1),
                       sp2 = runif(10, 0, 1),
                       sp3 = runif(10, 0, 1))

sppcodes <- c("sp1", "sp2", "sp3")

test.eval.list <- vector("list", length = length(sppcodes))
names(test.eval.list) <- sppcodes


for(i in seq_along(sppcodes)){
  sppn <- sppcodes[i]

  plot = df_obs$plot
  obs = df_obs[,sppn]
  pred = df_preds[,sppn]

  df <- data.frame(plot, obs, pred) #produces dataframe as expected

  test.eval.list[sppn] <- df #problem seems to be here, it ends up assigning a vector of numbers...  
}

有人可以帮助我理解为什么我没有得到数据框列表,并给出正确的方法吗?

请注意 - 我知道有些区域可以在一行代码中完成,我更喜欢这种分散代码的方式来了解哪些部分正在/不工作。

你在for循环中犯了一个小错误。 您必须在访问列表时使用[[而不是[ 如果您对访问元素的不同方式感兴趣,您可能需要阅读?Extract

for(i in seq_along(sppcodes)){

   sppn <- sppcodes[i]
   plot = df_obs$plot
   obs = df_obs[,sppn]
   pred = df_preds[,sppn]
   df <- data.frame(plot, obs, pred) 
   test.eval.list[[sppn]] <- df 
}

但是,另一种方法是使用Map

Map(cbind.data.frame, plot = list(df_obs$plot),obs=df_obs[-1],pred = df_preds[-1])

#[[1]]
#   plot obs      pred
#1     1   1 0.3266487
#2     2   1 0.3745092
#3     3   0 0.8633161
#4     4   0 0.1970302
#5     5   1 0.3017755
#6     6   0 0.9154151
#7     7   0 0.6193044
#8     8   0 0.4020479
#9     9   1 0.9947362
#10   10   1 0.7975380
#...
#....

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM