#r #loops #graph #ggplot2 #out
#r #циклы #График #ggplot2 #out
Вопрос:
Я пытаюсь запустить цикл, который выводит точечные диаграммы с помощью ggplot2. Вот сценарий:
У меня есть фрейм данных с 405 000 строк. Каждая строка ссылается на точку на точечном графике (значение x, значение y), а также связана с конкретным пациентом. На пациента приходится множество строк.
Чтобы выделить данные для каждого пациента, я использую следующее:
out <- split(df, f = df$patientID)
Затем я могу создать фрейм данных для каждого пациента следующим образом:
df_patientID <- out[[“patientID”]]
Затем я могу создать точечный график для каждого из этих отдельных фреймов данных пациента:
pl <- ggplot(df_patientID, aes(x = df_patientID$xval, y = df_patientID$yval))
pl geom_point(color=“red)
Это сработало для меня, но поскольку есть 472 пациента, я хотел бы сделать цикл, чтобы я мог получить точечный график для каждого пациента. Я создал вектор со всеми идентификаторами пациента («Идентификаторы пациента») и попробовал это:
`For (i in patientIDs){
j <- out[[“i”]]
pl <- ggplot(j, aes(x = df_i$xval, y=df_i$yval))
pl geom_point(color=“red”)
Но это выводит только значение «j», которое равно НУЛЮ. Любые предложения о том, как это сделать?
Ответ №1:
Вместо всего дополнительного кодирования для создания отдельных фреймов данных для каждого пациента вы можете просто подмножить фрейм данных на patientID
или разделить фрейм данных на patientID
при создании графиков. Кроме того, вы не должны повторять имя фрейма данных внутри aes
. Вы предоставляете фрейм данных в качестве первого аргумента ggplot
. Внутри aes
вы должны просто использовать имена столбцов.
Вместо цикла вам может быть проще создать список, содержащий все графики, которые затем можно распечатать, сохранить и т. Д.
library(ggplot2)
plot.list = lapply(split(df, df$patientID), function(dat) {
ggplot(dat, aes(x = xval, y = yval))
geom_point(color="red")
facet_wrap(~ patientID)
})
Каждый элемент plot.list
является графиком для одного patientID
, а имя каждого элемента списка является значением patientID
для этого графика. Например, после выполнения приведенного выше кода, если вы хотите увидеть график для patientID
548, введите plot.list[["548"]]
. Вы также можете сохранять графики в файл, размещать несколько графиков на странице и т. Д.
Чтобы распечатать каждый график в цикле, вы могли бы сделать это:
for (i in unique(df$patientID)) {
pl = ggplot(df[df$patientID==i, ], aes(x = xval, y = yval))
geom_point(color="red")
facet_wrap(~ patientID)
print(pl)
}
Или вы можете создать список графиков для последующей печати, сохранения и т. Д. вот так:
pl = list()
for (i in unique(df$patientID)) {
pl[[i]] = ggplot(df[df$patientID==i, ], aes(x = xval, y = yval))
geom_point(color="red")
facet_wrap(~ patientID)
}
Комментарии:
1. Это действительно здорово! Большое вам спасибо. Есть ли способ напрямую сохранить все графики в папку? или в одном файле pdf? Я пытался
2. Я попробовал следующее, но не сработало: MyPDFPath = «/Users/akalbasi/Dropbox/Coding/NIH GDC Data/Melanoma / VAF Plots /allplots.pdf» pdf(file=MyPDFPath) for (я в уникальном (df_MAF $Tumor_Sample_Barcode2)) { pl = ggplot(df_MAF[df_MAF $Tumor_Sample_Barcode2==i, ], aes(x = t_depth, y = t_alt_count)) geom_point(color=»red») facet_wrap(~ Tumor_Sample_Barcode2) } dev.off() RStudioGD 2
3. неважно, я против этого! ‘code’ MyPDFPath = «/Users/akalbasi/Dropbox/Coding/NIH GDC Data/Melanoma / VAF Plots/allplots.pdf» pdf(file=MyPDFPath) для (i в уникальном (df_MAF $Tumor_Sample_Barcode2)) { pl = ggplot(df_MAF[df_MAF $Tumor_Sample_Barcode2==i, ], aes(x = t_depth, y = t_alt_count)) geom_point(color=»red») facet_wrap(~ Tumor_Sample_Barcode2) print(pl) } dev.off()