用于循环长数据帧格式,用于每个分组变量的循环并输出到新数据帧

问题描述 投票:0回答:1

我有一个长格式的数据框,其中有四列,其中包括生计区,测量周期,观察值和预测值。我想对每个生计区域的这些列进行一些统计。我已经按字母顺序排列了民生区,因为我认为这可能对我有帮助。在此之后,我考虑了一个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`)
}
r loops dataframe spatial
1个回答
0
投票

考虑bytapply的面向对象包装器)以迭代列的级别或唯一值并构建分组数据帧的列表。然后在最后一个主数据帧的末尾运行do.call + rbind。使用这种方法,不需要初始化一个空的数据框来为其分配行,甚至不需要通过对变量进行分组来对列进行排序。

df_list <- by(dfUG, dfUG$`Livelihood zone`, function(sub) {
    data.frame(names = sub$`Livelihood zone`[1],
               bias = bias(sub$`IPC class`, sub$`IPC class2`),
               RMSE = hydroGOF::rmse(sub$`IPC class2`, sub$`IPC class`), 
               accuracy = NA)
})

final_df <- do.call(rbind, df_list)

以上在准确性列中填充NA,因为您没有显示应如何分配该列。相应地进行调整。

© www.soinside.com 2019 - 2024. All rights reserved.