Размер вложенных и не вложенных (аккуратных) 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?

0 ответов

Другие вопросы по тегам