for循环长数据帧格式,for循环每个分组变量并输出到新数据帧
for loop long dataframe format, for loop per grouped variable and output to new dataframe
我有一个长格式的数据框,它有四列,分别是生计区、测量周期、观察值和预测值。我想对每个生活区的这些列进行一些统计。我已经按字母顺序排列了生活区,因为我认为这可能对我有帮助。在此之后,我想到了一个 for 循环,它将遍历第一组相同的生计区,并将在数据帧的整个长度上这样做。但它并没有像我希望的那样表现。所以我的问题是你如何告诉 for 循环它应该执行它的第一个循环和超过固定数量的行之后的循环?
如果您想让我制作 REPREX 或我需要澄清一些事情,请告诉我!非常感谢!
dfUG_abc <- dfUG[order(dfUG$`Livelihood zone`), ]
names_period_UG <- unique(dfUG$`Period of measurement Uganda`)
count_period_UG <- length(names_period_UG)
names_lv_UG <- unique(dfUG$`Livelihood zone`)
count_lv_UG <- length(names_lv_UG)
Spatial_lv_UG <- data.frame(matrix(ncol = 4, nrow = count_lv_UG))
colnames(Spatial_lv_UG) <- c("names", "bias", "RMSE", "accuracy")
Spatial_lv_UG[,1] <- names_lv_UG
Spatial_lv_UG <- Spatial_lv_UG[order(Spatial_lv_UG$names),]
for (i in 1:count_lv_UG){
Spatial_lv_UG[i,3]<-hydroGOF::rmse(dfUG_abc$`IPC class2`, dfUG_abc$`IPC class`)
Spatial_lv_UG[i,2]<-bias(dfUG_abc$`IPC class`, dfUG_abc$`IPC class2`)
}
考虑 by
(tapply
的面向对象包装器)迭代级别或列的唯一值并构建分组数据框列表。然后 运行 a do.call
+ rbind
最后的主数据帧。使用这种方法,无需初始化空数据框即可为其分配行,甚至无需通过分组变量对列进行排序。
df_list <- by(dfUG, dfUG$`Livelihood zone`, function(sub) {
data.frame(zone = sub$`Livelihood zone`[1],
bias = bias(sub$`IPC class`, sub$`IPC class2`),
RMSE = hydroGOF::rmse(sub$`IPC class2`, sub$`IPC class`),
accuracy = NA)
})
Spatial_lv_UG <- do.call(rbind, df_list)
上面在 accuracy 列中填充了 NA
,因为您没有说明应该如何分配该列。相应调整。
我有一个长格式的数据框,它有四列,分别是生计区、测量周期、观察值和预测值。我想对每个生活区的这些列进行一些统计。我已经按字母顺序排列了生活区,因为我认为这可能对我有帮助。在此之后,我想到了一个 for 循环,它将遍历第一组相同的生计区,并将在数据帧的整个长度上这样做。但它并没有像我希望的那样表现。所以我的问题是你如何告诉 for 循环它应该执行它的第一个循环和超过固定数量的行之后的循环?
如果您想让我制作 REPREX 或我需要澄清一些事情,请告诉我!非常感谢!
dfUG_abc <- dfUG[order(dfUG$`Livelihood zone`), ]
names_period_UG <- unique(dfUG$`Period of measurement Uganda`)
count_period_UG <- length(names_period_UG)
names_lv_UG <- unique(dfUG$`Livelihood zone`)
count_lv_UG <- length(names_lv_UG)
Spatial_lv_UG <- data.frame(matrix(ncol = 4, nrow = count_lv_UG))
colnames(Spatial_lv_UG) <- c("names", "bias", "RMSE", "accuracy")
Spatial_lv_UG[,1] <- names_lv_UG
Spatial_lv_UG <- Spatial_lv_UG[order(Spatial_lv_UG$names),]
for (i in 1:count_lv_UG){
Spatial_lv_UG[i,3]<-hydroGOF::rmse(dfUG_abc$`IPC class2`, dfUG_abc$`IPC class`)
Spatial_lv_UG[i,2]<-bias(dfUG_abc$`IPC class`, dfUG_abc$`IPC class2`)
}
考虑 by
(tapply
的面向对象包装器)迭代级别或列的唯一值并构建分组数据框列表。然后 运行 a do.call
+ rbind
最后的主数据帧。使用这种方法,无需初始化空数据框即可为其分配行,甚至无需通过分组变量对列进行排序。
df_list <- by(dfUG, dfUG$`Livelihood zone`, function(sub) {
data.frame(zone = sub$`Livelihood zone`[1],
bias = bias(sub$`IPC class`, sub$`IPC class2`),
RMSE = hydroGOF::rmse(sub$`IPC class2`, sub$`IPC class`),
accuracy = NA)
})
Spatial_lv_UG <- do.call(rbind, df_list)
上面在 accuracy 列中填充了 NA
,因为您没有说明应该如何分配该列。相应调整。