Во-первых, некоторые пояснения: то, что вы называете подмножествами, является сгруппированным резюмеОбратитесь к «агрегат» для получения дополнительной информации. Во-вторых, ответ на каждый из ваших трех вопросов - да. В-третьих, ваше резюме уровня 1 эквивалентно вашему фрейму данных.
Поскольку вы используете aggregate()
, я сначала проиллюстрирую, как получить список сгруппированных резюме, используя aggregate()
:
library(tidyverse)
formula_list <-
list(
GDP ~ Year + Continent + Country + State.Province + City,
GDP ~ Continent + Country + State.Province + City,
GDP ~ Country + State.Province + City,
GDP ~ State.Province + City,
GDP ~ City
)
summaries <- formula_list %>%
map( ~ aggregate(.x, FUN = sum, data = myData))
Также возможно заменить aggregate()
наполностью dplyr
основанный подход. Положительным моментом является замена общеизвестно неэффективной aggregate()
. Недостатком является то, что нам придется иметь дело с вопросами, которые являются более сложной темой (для получения дополнительной информации обратитесь к vignette("programming")
).
var_combs <- list(
vars(Year, Continent, Country, State.Province, City),
vars(Continent, Country, State.Province, City),
vars(Country, State.Province, City),
vars(State.Province, City),
vars(City))
summaries <- var_combs %>%
map(~ myData %>%
group_by(!!!.x) %>%
summarize(GDP = sum(GDP)))
Далее следует применение вашего кода для расчета квартилей к каждому элементу списка. Поскольку вы также изменяете переменную группировки, нам нужно выполнить итерации по двум спискам, поэтому мы будем использовать purrr::map2()
:
grp_var <- list(
vars(Year),
vars(Continent),
vars(Country),
vars(State.Province),
vars(City)
)
map2(summaries[1:3],
grp_var[1:3],
~ .x %>%
group_by(!!!.y) %>%
mutate(Quantile = cut(GDP,
breaks = quantile(GDP, c(0, 0.25, 0.5, 0.75, 1)),
labels = 1:4,
include.lowest = TRUE))
)
. Вы заметите, что мне пришлось подгруппировать списки только для первых трех элементов. ,Код, который вы написали для расчета квартилей, не работает, если у одной из групп есть только одно наблюдение (что имеет смысл: вы не можете рассчитать квартили для выборки из одного). Это всегда будет иметь место для последней из пяти, так как она содержит только один элемент на группу по определению. Также сомнительно, если ваш результат особенно значим, если у вас есть только два или три наблюдения на группу.
Данные:
myData <- structure(list(
Year = c(2019, 2019, 2018, 2019, 2019, 2018, 2019,
2018, 2018, 2018, 2018, 2018, 2018, 2017, 2017, 2019, 2018, 2019,
2019, 2018, 2019, 2017, 2019, 2018, 2018, 2018, 2019, 2019),
Continent = c("North America", "Asia", "Asia", "North America",
"Asia", "North America", "Asia", "North America", "Asia",
"North America", "Asia", "Asia", "Asia", "North America",
"Asia", "North America", "Asia", "North America", "Asia",
"North America", "Asia", "Asia", "Asia", "North America",
"Asia", "Asia", "Asia", "Asia"),
Country = c("Canada", "India", "India", "USA", "China", "USA", "China",
"Canada", "China", "Canada", "India", "India", "China",
"USA", "China", "USA", "India", "Canada", "China", "USA",
"China", "India", "India", "Canada", "China", "China",
"India", "India"),
State.Province = c("Alberta", "Uttar Pradesh", "Bihar", "California",
"Shandong", "Florida", "Shandong", "Quebec", "Guangdong",
"Alberta", "Uttar Pradesh", "Bihar", "Shandong",
"California", "Guangdong", "Florida", "Uttar Pradesh",
"Quebec", "Guangdong", "California", "Guangdong", "Bihar",
"Bihar", "Alberta", "Shandong", "Guangdong", "Uttar Pradesh",
"Bihar"),
City = c("Edmonton", "Allahabad", "Patna", "Los Angeles", "Yantai", "Miami",
"Jinan", "Montreal", "Shenzhen", "Calgary", "Agra", "Gaya", "Yantai",
"Los Angeles", "Shenzhen", "Miami", "Allahabad", "Montreal",
"Shenzhen", "Los Angeles", "Guangzhou", "Patna", "Gaya", "Edmonton",
"Jinan", "Guangzhou", "Agra", "Patna"),
GDP = c(13, 21, 19, 23, 30, 14, 16, 11, 29, 9, 15, 8, 17, 18, 26, 19, 13, 7,
33, 25, 20, 22, 19, 3, 11, 19, 18, 16)),
class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"),
row.names = c(NA, -28L),
spec = structure(list(cols = list(Year = structure(list(), class = c("collector_double", "collector")),
Continent = structure(list(), class = c("collector_character", "collector")),
Country = structure(list(), class = c("collector_character", "collector")),
State.Province = structure(list(), class = c("collector_character", "collector")),
City = structure(list(), class = c("collector_character", "collector")),
GDP = structure(list(), class = c("collector_double", "collector"))),
default = structure(list(), class = c("collector_guess", "collector")),
skip = 2),
class = "col_spec"))