2015-06-14 2 views
0

Я пытаюсь исследовать большой набор данных, как с кадрами данных, так и с диаграммами. Я бы хотел проанализировать распределение каждой переменной с помощью разных показателей (например, sum (x), sum (x * y)) и для разных подгрупп. У меня есть 4 подгруппы, 2 метрики и множество переменных.Итерированный график из списка списка информационных кадров

Для того, чтобы достичь этого, я сделал структуру списка, например, как это:

$variable1 
...$metric1  <--- that's a df. 
...$metric2 
$variable2 
...$metric1 
...$metric2 

Внутри одного из data_frames (например, список $ variable1 $ METRIC1), я рассчитывается распределения уникальные значения для переменной 1 и для каждой из четырех групп населения (представлены в столбцах). Это выглядит следующим образом:

$variable1$metric1 
unique_values med_all med_some_not_all med_at_least_some med_none 
1 (1) 12-17 Years Old  NA    NA    NA  NA 
2 (2) 18-25 Years Old 0.278   0.317    0.278 0.317 
3 (3) 26-34 Years Old 0.225   0.228    0.225 0.228 
4  (4) 35 or Older 0.497   0.456    0.497 0.456 


$variable1$metric2 
     unique_values med_all med_some_not_all med_at_least_some med_none 
1 (1) 12-17 Years Old  NA    NA    NA  NA 
2 (2) 18-25 Years Old 0.544   0.406    0.544 0.406 
3 (3) 26-34 Years Old 0.197   0.310    0.197 0.310 
4  (4) 35 or Older 0.259   0.284    0.259 0.284 

То, что я пытаюсь выяснить, хороший способ перебрать список списков (возможно таяние ДФС в процессе), а затем выход тонны гистограмм. В этом случае формат естественного графика будет для каждого кадра данных сводной гистограммой с одним стеком для каждой подгруппы, группируя по уникальным значениям переменной.

Но я не знаком с повторным заговором, и поэтому я зашел в тупик. Как я могу сделать вывод из этой структуры списка? Альтернативно, есть ли лучшая структура, в которой я должен хранить эту информацию?

+0

Вы должны иметь хорошую ручку на список Подменит для работы со списком списков. в зависимости от структуры ваших dfs, может быть полезно объединить их. –

+0

Если вы хотите сделать небольшие кратные графики, я рекомендую пакет [compactr] (http://cran.r-project.org/web/packages/compactr/index.html) – shadowtalker

ответ

1

вот начало:

lst <- list(alpha= list(a= data.frame(matrix(1:4, 2)), b= data.frame(matrix(6:11, 2))), 
          beta = list(c = data.frame(matrix(11:14, 2)))) 

lst 
$alpha 
$alpha$a 
    X1 X2 
1 1 3 
2 2 4 

$alpha$b 
    X1 X2 X3 
1 6 8 10 
2 7 9 11 


$beta 
$beta$c 
    X1 X2 
1 11 13 
2 12 14 

#We can subset by number or by name 
lst[['alpha']] 
$a 
    X1 X2 
1 1 3 
2 2 4 

$b 
    X1 X2 X3 
1 6 8 10 
2 7 9 11 

lst[[1]] 
$a 
    X1 X2 
1 1 3 
2 2 4 

$b 
    X1 X2 X3 
1 6 8 10 
2 7 9 11 

#The dollar sign naming convention reminds us that we are looking at a list. 
#Let's sum the columns of both data frames in the alpha list 
lapply(lst[['alpha']], colSums) 
$a 
X1 X2 
3 7 

$b 
X1 X2 X3 
13 17 21 

Давайте попробуем найти сумму каждого столбца каждого кадра данных:

lapply(lst, colSums) 
Error in FUN(X[[i]], ...) : 
    'x' must be an array of at least two dimensions 

Что случилось? R правильно отказывается запускать функцию массива в списке. Функция colSums нуждается в передаче кадров данных, матриц и других массивов над одномерным. Мы должны вложить функцию lapply внутри другого. Логика может усложняться:

lapply(lst, function(x) lapply(x, colSums)) 
$alpha 
$alpha$a 
X1 X2 
3 7 

$alpha$b 
X1 X2 X3 
13 17 21 


$beta 
$beta$c 
X1 X2 
23 27 

Мы можем использовать rbind поставить data.frames вместе:

rbind(lst$alpha$a, lst$beta$c) 
    X1 X2 
1 1 3 
2 2 4 
3 11 13 
4 12 14 

Будьте уверены, чтобы не делать это так, как вы могли бы думать (я сделал это много раз):

do.call(rbind, lst) 
     a  b  
alpha List,2 List,3 
beta List,2 List,2 

Это не тот результат, который вы ищете. И убедитесь, что размеры и имена столбцов одинаковы:

do.call(rbind, lst[[1]]) 
Error in rbind(deparse.level, ...) : 
    numbers of columns of arguments do not match 

R отказывается объединить кадры данных, которые имеют 2 колонки в одном (альфа $ а) и три столбца в другой (альфа $ б).

Я изменил lst сделать alpha$b есть две колонки, как другие, и совместили их:

bind1 <- lapply(lst2, function(x) do.call(rbind, x)) 
bind1 
$alpha 
    X1 X2 
a.1 1 3 
a.2 2 4 
b.1 6 9 
b.2 7 10 
b.3 8 11 

$beta 
    X1 X2 
c.1 11 13 
c.2 12 14 

, который сочетает в себе элементы каждого списка. Теперь я могу объединить внешний список, чтобы создать один большой фрейм данных.

do.call(rbind, bind1) 
      X1 X2 
alpha.a.1 1 3 
alpha.a.2 2 4 
alpha.b.1 6 9 
alpha.b.2 7 10 
alpha.b.3 8 11 
beta.c.1 11 13 
beta.c.2 12 14 
2

Я нахожу вложенные списки, чтобы быть довольно сложно работать, так что я бы объединить их все в один кадр данных, который маркирует имя переменной и имя метрики:

lst <- list(alpha= list(a= data.frame(matrix(1:4, 2)), b= data.frame(matrix(6:9, 2))), beta = list(c = data.frame(matrix(11:14, 2)))) 
level1 <- lapply(lst, function(x) do.call(rbind, lapply(names(x), function(y) {x[[y]]$metric=y ; x[[y]]}))) 
dat <- do.call(rbind, lapply(names(level1), function(x) {level1[[x]]$variable=x ; level1[[x]]})) 
dat 
# X1 X2 metric variable 
# 1 1 3  a alpha 
# 2 2 4  a alpha 
# 3 6 8  b alpha 
# 4 7 9  b alpha 
# 5 11 13  c  beta 
# 6 12 14  c  beta 

Теперь вы можете использовать стандартные инструменты для управления одним фреймом данных для выполнения анализа данных.

1

Вот стратегия, основанная на таяние списка (рекурсивно),

lst = list(alpha= list(a= data.frame(matrix(1:4, 2)), 
         b= data.frame(matrix(6:11, 2))), 
      beta = list(c = data.frame(matrix(11:14, 2)))) 

library(reshape2) 
m = melt(lst, id=1:2) 
library(ggplot2) 
ggplot(m, aes(X1,X2)) + geom_bar(stat="identity") + facet_grid(L1~L2) 
Смежные вопросы