как использовать al oop | применить | map, чтобы разрезать фрейм данных для нескольких значений переменных и создать сводную статистику () в r - PullRequest
1 голос
/ 11 июля 2020

Я пытаюсь получить несколько результатов summary () из кадра данных. Я хочу несколько раз разбить подмножество по некоторым характеристикам. Затем получите summary () определенной переменной для каждого среза и объедините все результаты summary () либо в фрейм данных, либо в списке.

В идеале я хотел бы получить имя каждого building_id, которое я использую для среза данные как имя для этой строки сводки (). Поэтому я подумал об использовании a для l oop.

Данные достаточно большие (около 20 м. Строк), и я использую фреймы данных train и building_metadata, объединенные в один из прогноза энергии ашраев от kaggle здесь

Я создал тиббл, который содержит идентификаторы зданий, которые я хочу использовать. Я хочу получить сводку () переменной «energy_sqm» (которую я уже создал), поэтому я пытаюсь поместить этот фрагмент в для l oop:

Предупреждение 1. Мой столбец building_id имеет значения например 50, 67, 778, 1099 и т. д. c. Итак, одна из моих проблем связана с использованием этих чисел, если я попытаюсь использовать их для какой-то индексации или наименования моих итоговых результатов. Я думаю, что он пытается создать строку 50, 67 и c в нескольких разных испытаниях, которые я сделал.

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, который я использую для инициализации, я не могу заставить его сохранить что-либо внутри l oop, поэтому я предполагаю, что я испортил также l oop.

b) В идеале я хотел бы иметь building_id как идентификатор Summary () statisti c

c) Может ли кто-нибудь предложить, каков принцип хорошей практики для таких циклов с точки зрения использования списка, таблицы или чего-то еще.

Подробности: класс () summary () равен "summaryDefault" "table", о котором я ничего не знаю.

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

Мы также можем использовать tidyverse. После группировки по 'Species', tidy результат summary Sepal.Length. Здесь результат tidy - это tibble/data.frame. В dplyr 1.0.0 мы могли бы использовать это без заключения в list, но также могли бы включать атрибут имени столбца с $, потому что у нас есть out и имена столбцов из tidy. Чтобы этого избежать, мы оборачиваем 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
0 голосов
/ 11 июля 2020

Похоже, что это суммирование по группам. Вот способ сделать это с помощью , хотя я не уверен в вашем точном ожидаемом результате:

library(broom)
library(data.table)
dt_iris = as.data.table(iris)
dt_iris[, tidy(summary(Sepal.Length)), by = Species]

#>       Species minimum    q1 median  mean  q3 maximum
#> 1:     setosa     4.3 4.800    5.0 5.006 5.2     5.8
#> 2: versicolor     4.9 5.600    5.9 5.936 6.3     7.0
#> 3:  virginica     4.9 6.225    6.5 6.588 6.9     7.9

Создано 11 июля 2020 г. пакет (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...