2014-01-20 3 views
0

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

Моя идея - использовать tapply на самоопределенной функции. Это работает в принципе (см. Ниже). Моя единственная проблема заключается в том, что я не знаю, чтобы получить доступ к соответствующей комбинации категориальных переменных, как название сюжета внутри функции. ** Как я могу получить к ним доступ?

текущее решение:

cat1 <- c("A","A","A","A","E") 
cat2 <- c("a","c","c","c","e") 
obs <- c(2.0,2.2,2.5,5.0,1.0) 

my_plot <- function(obs_subset,??_cat1-val,cat2-val_??) { 
    if(length(obs_subset) > 2) boxplot(obs_subset, 
    main=paste(cat1-val,cat2-val,sep = " ")) ;# how to compute the title 
} 
indices <- list(cat1,cat2) 

pdf(file="theFileName.pdf") 
tapply(obs,indices,my_plot) 
dev.off() 

Он работает без значений категориальных переменных.
Как я могу получить доступ к фактическим значениям cat1 и cat2 в соответствующих вызовах, чтобы их можно было использовать для обозначения графиков?

+0

Я думаю, вам нужно лучше описать ваш предполагаемый результат ... как вы планируете сделать несколько ящиков из подмножества одной переменной? – Thomas

+0

Спасибо, решение Свена Х работало как шарм. – joheid

ответ

0

Вы можете создать числовой индекс по obs и использовать его внутри tapply:

idx <- seq_along(obs) 

Индекс используется для извлечения значений из obs, cat1 и cat2:

my_plot <- function(obs_idx) { 
    if(length(obs[obs_idx]) > 2) 
    boxplot(obs[obs_idx], 
      main = paste(cat1[obs_idx[1]], 
         cat2[obs_idx[1]])) 
} 

Теперь, вы можно использовать tapply. Я рекомендую использовать invisible, если вас не интересуют значения, возвращаемые tapply.

pdf(file = "theFileName.pdf", onefile = TRUE) 
invisible(tapply(idx, indices, my_plot)) 
dev.off() 
Смежные вопросы