Цикл для создания серии графиков из разных файлов

Я пытаюсь построить гистограммы с долгосрочными (несколько лет) средними осадками (pp) для каждого дня месяца из серии файлов. Каждый файл имеет данные, собранные из другого места (и имеет другой код). Каждый из моих файлов выглядит так:

 X code year month day  pp  
 1 2867 1945     1   1 0.0  
 2 2867 1945     1   2 0.0   
... 

И я использую следующий код:

files <- list.files(pattern=".csv")  
par(mfrow=c(4,6))  
for (i in 1:24) {  
    obs <- read.table(files[i],sep=",", header=TRUE)  
    media.dia <- ddply(obs, .(day), summarise, daily.mean<-mean(pp))  
    codigo <- unique(obs$code)  
    hist(daily.mean, main=c("hist per day of month", codigo))  
}

Я получаю 24 гистограммы с 24 разными кодами в заголовке, но вместо 24 РАЗНЫХ гистограмм из 24 разных мест я получаю одну и ту же гистограмму 24 раза (с 24 разными заголовками). Кто-нибудь может сказать мне, почему? Спасибо!


person sbg    schedule 25.05.2011    source источник
comment
Где вы определяете daily.mean? (Да, я вижу, что это имя столбца в media.dia, но вы не передаете media.dia в hist.)   -  person Andrie    schedule 25.05.2011
comment
Я виню нормальное распределение. Проклятые гистограммы всегда выглядят так же, как n---› бесконечность.   -  person Brandon Bertelsen    schedule 25.05.2011
comment
@brandon- лол, у меня n не такое уж большое, они точно такие же графы   -  person sbg    schedule 25.05.2011
comment
Немного статистического юмора :)   -  person Brandon Bertelsen    schedule 25.05.2011
comment
@ Andrie - daily.mean - это среднее значение pp, рассчитанное за день из media.dia. Разве этого недостаточно для определения? Если я сделаю head(daily.mean), я получу [1] 0.9579545 1.0464646 1.2237374 0.9840909 1.0205808 0.8277778   -  person sbg    schedule 25.05.2011
comment
Это может быть просто ваш вызов файлов. Вместо этого попробуйте использовать [[i]].   -  person Brandon Bertelsen    schedule 25.05.2011
comment
@sbg, да, я это вижу, но ваша функция hist этого не видит. Ваш вызов ddply добавит столбец в media.dia с именем столбца daily.mean. Но media.dia не привязан. Смотрите мой ответ.   -  person Andrie    schedule 25.05.2011
comment
@brandon, если бы это было правдой, то заголовок сюжета тоже потерпел бы неудачу.   -  person Andrie    schedule 25.05.2011
comment
@ Брэндон - спасибо, но это все еще не работает ...   -  person sbg    schedule 25.05.2011
comment
Вставьте browser() сразу после { и выполните код шаг за шагом. Это в основном то, что мы можем сделать с вашим невоспроизводимым примером.   -  person Roman Luštrik    schedule 25.05.2011


Ответы (2)


В вашем коде я вижу как минимум две ошибки.

  1. В вашем заявлении ddply есть ошибка.
  2. Вы передаете неправильную переменную в hist, тем самым отображая что-то, что может существовать или не существовать в зависимости от предыдущих действий сеанса.

Проблема в вашем операторе ddply заключается в том, что вы выполняете недопустимое назначение (используя <- ). Исправьте это, используя =:

media.dia<- ddply(obs, .(day),summarise, daily.mean = mean(pp))

Затем отредактируйте свой оператор hist:

hist(media.dia$daily.mean,main=c("hist per day of month",codigo))

Я подозреваю, что проблема в том, что вы не передаете правильный параметр в hist. Причина, по которой ваш код вообще создает график, заключается в том, что на каком-то предыдущем этапе вашего сеанса вы должны были создать переменную с именем daily.mean (как указывает Брэндон в комментарии).

person Andrie    schedule 25.05.2011
comment
Интересно, возможно, он рассчитывал daily.mean как другой объект в рабочей области, и поэтому он не получал сообщений об ошибках? - person Brandon Bertelsen; 25.05.2011
comment
@Брэндон. Да, точно. Я уверен, что это то, что происходит. - person Andrie; 25.05.2011
comment
Спасибо, но выдает ошибку: Error in hist.default(media.dia$daily.mean, main = c("hist per day of month", :'x' must be numeric - person sbg; 25.05.2011
comment
Хорошо, я заметил еще одну ошибку в вашем коде. Я обновлю свой ответ. - person Andrie; 25.05.2011
comment
вы правы, я закрываю r и снова открываю, и теперь я получаю ошибку. Я думаю, что проблема с media.dia<- ddply(obs, .(day),summarise, daily.mean<-mean(pp)), потому что он дает столбец с днями, а другой - с NA. - person sbg; 25.05.2011

Я думаю, что daily.mean, вычисленный в функции ddply, назначается в отдельной среде и не существует в среде, которую hist может видеть.

Попробуйте daily.mean<<-mean(pp)

person James    schedule 25.05.2011
comment
Назначение вышестоящим средам с использованием <<- следует использовать только в очень редких случаях, и это не один из них. <- должно быть = - person Andrie; 25.05.2011
comment
@ Андри, я согласен, твое решение более подходящее. На самом деле не думал, почему OP вообще назначал в операторе ddply. - person James; 25.05.2011
comment
Простая ошибка, я думаю. Это случалось со мной достаточно часто, особенно при кодировании data.frame статусов. - person Andrie; 25.05.2011