подстановка df по группе, перебор диаграмм рассеяния

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

site           code            value

1              x                30
1              y                14
1              z                12
2              x                35
2              y                19

и т.д,

где сайт = числовое значение, значение = числовое значение, код = переменная группировки.

Там около 400 сайтов и 300 кодов.

Что я хочу:

  1. подмножество df на основе поля = код
  2. график x = сайт против y = значение, как точечный график
  3. запишите каждую диаграмму рассеяния на отдельную страницу в формате .pdf
  4. автоматизировать процесс

Любые комментарии приветствуются. Этот подход, например, генерирует ошибку, которую «подмножество» должно оценивать как логическое. Лаппли-звонок тоже может не работать.

dfarray<-list(subset(df,df[,2]))
pdf(file="test.pdf")
figures<-lapply(dfarray, function(i) {(plot(i$[,1],i$[,3]))
})
dev.off()

Спасибо большое

Включение d_ply сработало отлично. Я доволен этим результатом, но может ли кто-нибудь указать, что не так с оператором метки для осей X, Y? (Примечание: этот блок кода приводит к 1 PDF-файлу на подмножество)

names(df)<-tolower(names(df))
names(df)
d_ply(df,"code",function(x){
pdf(file=paste(unique(x$code),".pdf"))
plot(data=x,value~site, xlab=names(x[1]),ylab=as.name(x$code))
dev.off()
})

Обновление: ниже приведены две функционирующие версии этого кода, при условии, что фрейм данных df существует. Этот записывает диаграмму рассеяния каждой группы в отдельный .pdf:

names(df)<-tolower(names(df)
names(df)
d_ply(df,"code",function(x){
pdf(file=paste(unique(x$code),".pdf"))
plot(data=x, value~site, xlab=names(df[1]),ylab=unique(x$code))
dev.off()
})

Этот записывает все диаграммы рассеяния, по одной на группу, в один файл .pdf:

names(df)<-tolower(names(df)
names(df)
pdf(file="df_all.pdf")
d_ply( df, "code", function(x) {
plot(data=x, value~site, xlab=names(df[1]), ylab=unique(x$code))
})
dev.off()

person user2009447    schedule 29.05.2013    source источник
comment
1.) paste(unique(x$code),".pdf") приводит к именам файлов с пробелами, т. е. x .pdf, y .pdf и т. д. Используйте либо paste0, либо paste( ..., sep =""). 2.) x — это data.frame, поэтому x$code — это вектор, поэтому, возможно, вы захотите вызвать ylab=unique(x$code).   -  person Beasterfield    schedule 30.05.2013


Ответы (1)


Я бы выбрал plyr::d_ply:

library(plyr)
pdf(file="test.pdf")
d_ply( df.1, "code", function(x) plot( data = x, value~site, main = unique(x$code) ) )
dev.off()

Вы можете прочитать общие сведения о стратегии разделить-применить-(объединить).

person Beasterfield    schedule 29.05.2013
comment
Первая версия работала отлично, 1 pdf на сюжет. Эта версия создает один файл .pdf, верно? - person user2009447; 30.05.2013
comment
вы правы, но это второе решение соответствует вашему вопросу: запишите каждую диаграмму рассеяния на отдельную страницу в .pdf - person Beasterfield; 30.05.2013
comment
Как насчет добавления меток x и y. Что-то не так с моим оператором label, вставленным в первую переработку кода с помощью d_ply: - person user2009447; 30.05.2013
comment
Спасибо за совет. Я понял. Извините, это был тривиальный вопрос. - person user2009447; 31.05.2013