r - 如何使用循环 | 申请 | 映射以对多个变量值的数据框进行切片并在 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"
我一无所知的。
谢谢您的帮助。
解决方案
我们也可以使用tidyverse
. 按'Species'分组后, 'Sepal.Length'tidy
的summary
输出。在这里,tidy
输出是一个tibble/data.frame
。在dplyr
1.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
推荐阅读
- python - 没有名为 Crypto.Cipher Open EdX 的模块
- javascript - 如何在 React js 中渲染实际图像之前渲染默认图像?
- django - 如何在 FormMixin 和 DetailView 中设置初始数据
- c# - 如何将 TPL 数据流 TranformBlock 或 ActionBlock 放在单独的文件中?
- vue.js - 如何仅在关闭浏览器(VueJs)后清理 localeStorage?
- c - 我只需要一个输出,但它是两个或更多
- nestjs - NestJS - 组合多个警卫并在一个返回 true 时激活
- flutter - 如何在颤动的另一个页面上从地图中获取价值
- python - Azure ML:“顺序”对象没有属性“_distribution_strategy”
- windows-services - OctopusDeploy:是否可以指定应部署 Windows 服务的文件夹?