![](/img/trans.png)
[英]In R, how do I use stub to create names (of data frames, variables & plots) in a loop?
[英]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.