ggplot через расплавленный data.frame в R

Вот структура фрейма данных, с которой я работаю:

> str(final.c)
'data.frame':   218916 obs. of  7 variables:
 $ strain  : chr  "CX11285" "ED3048" "JU1200" "CX11315" ...
 $ row     : Factor w/ 8 levels "A","B","C","D",..: 1 1 1 1 1 1 2 2 2 2 ...
 $ col     : Factor w/ 12 levels "1","2","3","4",..: 1 3 5 7 9 11 1 3 5 7 ...
 $ variable: Factor w/ 79 levels "n","meanTOF",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ value   : num  312 697 159 381 175 110 324 198 179 375 ...
 $ L1      : int  1 1 1 1 1 1 1 1 1 1 ...
 $ set     : num  1 1 1 1 1 1 1 1 1 1 ...

Вот пример гистограммы, сгенерированной ggplot:

var <- "norm.n"
plate <- c(1,5)
dat <- final.c
day <- 1
plot <- ggplot(subset(dat, variable %in% var & L1 %in% plate & set %in% day), 
               aes(value, fill = factor(L1))) + geom_histogram()

На приведенном выше графике рассматривается подмножество этого большого расплавленного data.frame (я говорю, что он расплавлен, потому что я запускал расплав в списке data.frames до «final.c»). В частности, это подмножество, когда установлено = 1 и когда переменная = "norm.n" и когда L1 = 1 или 5. Это создает две гистограммы, которые я разделяю по цветам.

Что я хотел бы сделать, так это разработать функцию, которая генерирует несколько графиков. Графики будут включать: Гистограммы, отображающие «планшеты» (L1 в final.c) от 1 до планшетов 5-30 для каждой переменной (переменная в final.c). Это также должно быть сгруппировано по набору, которых 2 (набор 1 и набор 2).

Таким образом, получится 26 (количество сравнений планшетов) X 80 (количество переменных в final.c) = 2080 графиков. Я подмножу список переменных, чтобы сделать графики более управляемыми, но идея должна быть той же.

Ради вопроса давайте просто назовем переменные в этом примере v1...v80

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

ИЗМЕНИТЬ ::

Следуя предложению в комментариях, я сделал простой цикл for для создания графиков для сравнения каждой пластины (L1 в final.c), он выглядит следующим образом:

for(i in 5:10){
  var <- "norm.n"
  plate <- c(1, i)
  dat <- final.c
  day <- 1
  plot <- ggplot(subset(dat, variable %in% var & L1 %in% plate & set %in% day), 
                 aes(value, fill = factor(L1))) + geom_histogram()
  setwd("~/Dropbox/Andersen lab/LabFolders/Stefan/testplots/")
  ggsave(filename = paste(var, i, ".jpg", sep = ""), plot = plot, height=4, width=8, units="in", dpi=300)
}

Это дает мне 6 графиков гистограмм, сравнивающих два разных значения L1 из final.c. Я могу легко расширить это, чтобы сделать все сравнения пластин (например, для (i в 5:30)).

Вот и остался вопрос - Как зациклить по пластинам и одновременно по переменным. Столбец «переменная» в файле final.c представляет собой набор факторов с 79 уровнями. То, что я хотел бы сделать, это перебрать эти факторы, но я не уверен, как это сделать. Как показано ниже:

for(i in 5:10){
  var <- ***LOOP THROUGH VARIABLES COLUMN IN final.c***
  plate <- c(1, i)
  dat <- final.c
  day <- 1

Я просто не уверен в синтаксисе этого.


person user2813055    schedule 01.04.2014    source источник
comment
Где именно ты застрял? Вы пытались обернуть это в цикл for, чтобы просмотреть наборы тарелок, которые вы хотите отобразить? Попробуйте разбить проблему на части и решать их по очереди.   -  person Gregor Thomas    schedule 01.04.2014
comment
@shujaa, я внес правку в вопрос, чтобы ответить на ваш вопрос. Я думаю, что это делает то, где я застрял, более ясным. Спасибо.   -  person user2813055    schedule 01.04.2014


Ответы (2)


вот что я придумал спасибо за правильное направление @shujaa

for(j in levels(final.c$variable)){
  for(i in 5:6){
    var <- j
    plate <- c(1, i)
    dat <- final.c
    day <- 1
    plot <- ggplot(subset(dat, variable %in% var & L1 %in% plate & set %in% day), 
                   aes(value, fill = factor(L1))) + geom_histogram()
    setwd("~/Dropbox/Andersen lab/LabFolders/Stefan/testplots/")
    ggsave(filename = paste(var, j, i, ".jpg", sep = ""), plot = plot, height=4, width=8, units="in", dpi=300)
  }
}

все, что еще нужно включить, это набор 1 и 2, но на этом этапе это должно быть прямолинейно.

person user2813055    schedule 01.04.2014

Вам нужно вложить свои петли. Чтобы упростить понимание, вместо использования i и j мы будем использовать более описательные имена.

Кроме того, вы должны иметь возможность просто установить свой рабочий каталог один раз перед циклами. И копировать final.c в dat тоже не нужно.

Что-то вроде этого

setwd("~/Dropbox/Andersen lab/LabFolders/Stefan/testplots/")

for (end_plate in 5:10) {
    for (var in unique(final.c$variable)) {
        plate <- c(1, end_plate)
        day <- 1
        plot <- ggplot(subset(final.c, variable %in% var & L1 %in% plate & set %in% day), 
                       aes(value, fill = factor(L1))) + geom_histogram()  
        ggsave(filename = paste(var, end_plate, ".jpg", sep = ""),
               plot = plot, height=4, width=8, units="in", dpi=300)
  }
}
person Gregor Thomas    schedule 01.04.2014