如何使用for循环在R中基于两个现有数据帧创建数据帧列表?
我是个新手。我的一些循环已经成功了,其他的。。。没有那么多 我有一些观测数据(df_obs),我想根据我的模型预测(df_pred)进行测试 我目前的目标是:编写一个循环,生成一个数据帧列表,以便在将来评估模型性能的循环中使用此列表。我可能会回来帮你处理这些循环 是:我想要一个数据帧列表。我正在研究50多种物种,并对这些值进行了一系列测试 也许:我想我想要一个for()循环,但如果另一个方法更简单,例如lappy(),我愿意接受建议 我已经尽了最大努力创建了一个可复制的数据集和代码,以模仿我的工作:如何使用for循环在R中基于两个现有数据帧创建数据帧列表?,r,list,dataframe,for-loop,R,List,Dataframe,For Loop,我是个新手。我的一些循环已经成功了,其他的。。。没有那么多 我有一些观测数据(df_obs),我想根据我的模型预测(df_pred)进行测试 我目前的目标是:编写一个循环,生成一个数据帧列表,以便在将来评估模型性能的循环中使用此列表。我可能会回来帮你处理这些循环 是:我想要一个数据帧列表。我正在研究50多种物种,并对这些值进行了一系列测试 也许:我想我想要一个for()循环,但如果另一个方法更简单,例如lappy(),我愿意接受建议 我已经尽了最大努力创建了一个可复制的数据集和代码,以模仿我的工
#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...
}
#观察到的存在(1)和不存在(0)
种子集(733)
df_obs您在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(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
#...
#....