首页 > 解决方案 > 如何使用循环 | 申请 | 映射以对多个变量值的数据框进行切片并在 r 中创建多个统计摘要()

问题描述

我正在尝试从数据框中获取多个 summary() 输出。我想多次根据某些特征进行子集化。然后获取每个切片的某个变量的 summary() 并将所有 summary() 输出放在数据帧或列表中。

理想情况下,我想获取我用来切片数据的每个 building_id 的名称作为该行摘要()的名称。所以我想到了使用for循环。

数据足够大(大约 20 m. 线),我正在使用来自 kaggle 的 ashrae 能量预测的 train 和 building_metadata 数据框合二为一

我创建了一个 tibble,其中包含我想要子集的建筑物 ID。我想得到变量“energy_sqm”(我已经创建)的summary(),所以我试图把这个切片放在一个for循环中:

警告 1:我的 building_id tibble 的值有 50、67、778、1099 等。所以我遇到的问题之一是使用这些数字,如果我尝试将它们用于某种索引或命名我的摘要输出。我认为它试图在我做的几个不同的试验中制作第 50 行、第 67 行等。

summaries_output <- tibble() # or list() `

for (id in building_id){

temp_stats <- joined %>% 
              filter(building_id == "id") %>% 
              pull(energy_sqm) %>% 
              summary() %>% 
              broom:tidy()
summaries_output <- bind_rows(summaries_output, temp_stats, .id = "id")

`

我的问题:

a) 无论我使用什么 summaries_output 来初始化,我都无法让它在循环中保留任何东西,所以我猜我也在搞乱循环。

b)理想情况下,我希望将 building_id 作为 summary() 统计信息的标识符

c) 有人可以就使用列表、表格或其他内容提出这类循环的良好实践原则吗?

详细信息: summary() 的 class() 是"summaryDefault" "table"我一无所知的。

谢谢您的帮助。

标签: rloopsdplyr

解决方案


我们也可以使用tidyverse. 按'Species'分组后, 'Sepal.Length'tidysummary输出。在这里,tidy输出是一个tibble/data.frame。在dplyr1.0.0 中,我们可以使用它而不用包装 a list,但它也可以包含一个列名属性,$因为我们有out和来自 的列名tidy。为避免这种情况,我们包装在 a 中list,然后unnest创建列

library(dplyr)
library(broom)
library(tidyr)
iris %>%
   group_by(Species) %>%
   summarise(out = list(tidy(summary(Sepal.Length)))) %>%
   unnest(c(out))
# A tibble: 3 x 7
#  Species    minimum    q1 median  mean    q3 maximum
#  <fct>        <dbl> <dbl>  <dbl> <dbl> <dbl>   <dbl>
#1 setosa         4.3  4.8     5    5.01   5.2     5.8
#2 versicolor     4.9  5.6     5.9  5.94   6.3     7  
#3 virginica      4.9  6.22    6.5  6.59   6.9     7.9

推荐阅读