2015-11-13 2 views
2

Таким образом, у меня есть кадр данных, установить бит, как это:цикл генерации участков для переменных в кадре данных

Sample V1 V2 V3 Group1 Group2 
bob 12 32 12 G1  G2 
susan 43 23 54 G2  G2 
mary 23 65 34 G1  G2 

я в состоянии сделать сгруппированный boxplot каждой переменной (V1, V2, V3) индивидуально, сгруппированные по переменным Group1 и Group2, но у моего реального набора данных есть WAY больше переменных, и будет утомительно кодировать индивидуально. Есть ли способ, которым я могу зацикливать процесс и автоматизировать создание и экспорт сюжетов? Для петель все еще немного неясная тема для меня.

Вот код, я использую, чтобы сформировать индивидуальный сюжет:

png(filename= "filename.jpg") 
ggplot(aes(y=data$V1, x=data$Group1, fill=data$Group2), data=data) + geomboxplot() 
dev.off() 

Спасибо!

+0

Что именно вы боретесь с? Что вы пробовали? Существует несколько подходов, частично зависящих от ваших данных. Вы можете преобразовать свои данные в длинный формат и использовать грани или подход split/lapply. Или зациклируйте нужные столбцы для создания графика, например, с помощью aes_string. – Heroka

+0

Я могу представить, как можно использовать цикл for для вызова отдельных столбцов фрейма данных, содержащих переменные (V1, V2 и т. Д.), Но я не знаю, как указать переменные группировки (Group1, Group2) и сохранить эти от изменения в цикле. Я действительно не знаком с написанием циклов и синтаксисом. – lmrta

+0

Я думаю, что фасетный сюжет может быть тем, что ищет OP. тают эти вары в один вар, а затем и фасет. Чтобы заняться в данный момент, чтобы закодировать его, но не составит труда. Должен посмотреть на reshape2, чтобы сделать расплав. –

ответ

3

Вот несколько подходов для вас. Я предполагаю, что есть дубликат, но если вы только начинаете, не всегда легко применить эти ответы на свои данные.

library(reshape2) 
library(ggplot2) 
###create some data 
set.seed(100) 
n = 500 

dat <- data.frame(sample = sample(LETTERS[1:10],n,T), 
        V1 = sample(50,n,T), 
        V2 = sample(50,n,T), 
        V3 = sample(50,n,T), 
        Group1 = paste0("G",sample(3,n,T)), 
        Group2 = paste0("G",sample(5,n,T))) 

подход 1: растопить и фаска

dat_m <- melt(dat,measure.vars = c("V1","V2","V3")) 

p1 <- ggplot(dat_m, aes(x = Group1,y = value,fill = Group2))+ 
    geom_boxplot() + facet_wrap(~variable) 
p1 

enter image description here

Как вы можете видеть, это не представляется возможным, если у вас есть слишком много переменных группирования.

подход 2: разные графики/изображения для переменной, все еще использующие длинные данные. Я разделил длинные данные по переменной и создал график для каждого фрагмента. Текущий код отображается на консоли; файл с сохранением кода закомментирован.

lapply(split(dat_m, dat_m$variable), function(chunk){ 
    myfilename <- sprintf("plot_%s.png", unique(chunk$variable)) 

    p <- ggplot(chunk, aes(x = Group1,y = value,fill = Group2)) + 
    geom_boxplot() + labs(title = myfilename) 
    p 
# #png(filename = myfilename) 
# print(p) 
# dev.off() 

}) 

И третий подход заключается в использовании строк столбцов вы заинтересованы в:

#vector of columns you want to plot 
mycols <- c("V1","V2","V3") 

#plotting for each column. Not that I've put the 'fixed' variable 
#inside aes in the main call to ggplot, and the 'varying' variable 
#inside aes_string in the call to boxplot 

lapply(mycols, function(cc){ 
    myfilename <- sprintf("plot_%s.png",cc) 
    p <- ggplot(dat, aes(x = Group1,fill = Group2)) + 
    geom_boxplot(aes_string(y = cc)) + labs(title = myfilename) 
    p 
    # #png(filename = myfilename) 
    # print(p) 
    # dev.off() 
}) 
+0

Отлично! Благодарю вас, функция lapply именно то, что я изо всех сил пытался написать. Радости биолога пытаются научиться кодированию. Спасибо за вашу помощь! – lmrta

+0

У меня есть цикл работы для создания графиков в студии R, но как-то функция 'png()', похоже, не работает, она создает только пустые изображения, когда я добавляю эту часть кода обратно. Какие-либо предложения? – lmrta

+0

Вы должны использовать 'print (p)'. К сожалению, я не тестировал эту часть кода. Редактировал мой ответ. – Heroka

Смежные вопросы