Размер вложенных и не вложенных (аккуратных) data.frame?
В этом вопросе используется data.frame, который содержит столбцы списка (вложенные). Мне было интересно, почему / если есть преимущество работы таким образом. Я предполагал, что вы захотите минимизировать объем памяти, используемый каждой таблицей... Но когда я проверял, я был удивлен:
Сравните размеры таблицы для вложенного и аккуратного формата:
1. Сгенерируйте вложенные / аккуратные версии 2-х и 5-ти колонок данных.
library(pryr)
library(dplyr)
library(tidyr)
library(ggvis)
n <- 1:1E6
df <- data_frame(id = n, vars = lapply(n, function(x) x <- sample(letters,sample(1:26,1))))
dfu <- df %>% unnest(vars)
df_morecols <- data_frame(id = n, other1 = n, other2 = n, other3 = n,
vars = lapply(n, function(x) x <- sample(letters,sample(1:26,1))))
dfu_morecols <- df_morecols %>% unnest(vars)
они похожи:
head(df)
#> Source: local data frame [6 x 2]
#> id vars
#> 1 1 <chr[16]>
#> 2 2 <chr[4]>
#> 3 3 <chr[26]>
#> 4 4 <chr[9]>
#> 5 5 <chr[11]>
#> 6 6 <chr[18]>
head(dfu)
#> Source: local data frame [6 x 2]
#> id vars
#> 1 1 k
#> 2 1 d
#> 3 1 s
#> 4 1 j
#> 5 1 m
#> 6 1 t
head(df_morecols)
#> Source: local data frame [6 x 5]
#> id other1 other2 other3 vars
#> 1 1 1 1 1 <chr[4]>
#> 2 2 2 2 2 <chr[22]>
#> 3 3 3 3 3 <chr[24]>
#> 4 4 4 4 4 <chr[6]>
#> 5 5 5 5 5 <chr[15]>
#> 6 6 6 6 6 <chr[11]>
head(dfu_morecols)
#> Source: local data frame [6 x 5]
#> id other1 other2 other3 vars
#> 1 1 1 1 1 r
#> 2 1 1 1 1 p
#> 3 1 1 1 1 s
#> 4 1 1 1 1 w
#> 5 2 2 2 2 l
#> 6 2 2 2 2 j
2. Рассчитайте размеры объекта и размеры столбца.
from: lapply(list(df,dfu,df_morecols,dfu_morecols),object_size)
170 МБ против 162 МБ для вложенных и аккуратных 2-столбных df
170 МБ против 324 МБ для вложенных и аккуратных 5-полных df
col_sizes <- sapply(c(df,dfu,df_morecols,dfu_morecols),object_size)
col_names <- names(col_sizes)
parent_obj <- c(rep(c('df','dfu'),each = 2),
rep(c('df_morecols','dfu_morecols'),each = 5))
res <- data_frame(parent_obj,col_names,col_sizes) %>%
unite(elementof, parent_obj,col_names, remove = F)
3. Графики размеров столбцов, раскрашенные родительским объектом:
res %>%
ggvis(y = ~elementof, x = ~0, x2 = ~col_sizes, fill = ~parent_obj) %>%
layer_rects(height = band())
Вопросы:
- Чем объясняется меньшая площадь опрятного 2-col df по сравнению с вложенным?
- Почему этот эффект не изменится на 5-значную df?