Как получить дату максимальных значений осадков в языке программирования R - PullRequest
1 голос
/ 05 апреля 2011

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

Я попробовал следующий код:

for (imonth in 1:12) {
    month <- which(data[,2]==imonth)
    monthly_max[imonth] <- max(data[month,3])
    maxi[imonth] <- which.max(data[month,3])
}
tabela <- cbind(monthly_max, maxi)
write.table(tabela, col.names=TRUE, row.names=TRUE, append=FALSE, sep="\t")

Максимальный месячный максимум работал отлично, но функция which.max работает неправильно. Дает мне строки, которые не соответствуют максимальным значениям осадков. Кто-нибудь может сказать мне, почему или, возможно, предложить лучший способ сделать это?

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 05 апреля 2011

Вот возможное решение с использованием пакета plyr

library(plyr)

# create a dummy data frame
df = data.frame(date     = sample(LETTERS, 100, replace = T), 
                month    = sample(12, 100, replace = T), 
                rainfall = sample(1000, 100, replace = F));

# use plyr to figure out max rainfall and date for each month
df.max = ddply(df, .(month), summarize, 
            max.rain      = max(rainfall),
            date.max.rain = date[which.max(rainfall)])

Дайте мне знать, если это работает.

РЕДАКТИРОВАТЬ.Если имеется несколько дат с максимальным количеством осадков, код необходимо слегка изменить

# find max rainfall for each month
df.max = ddply(df, .(month), transform, max.rain = max(rainfall))

# extract subset such that max.rain = rainfall
df.max = subset(df.max, max.rain == rainfall)
0 голосов
/ 05 апреля 2011

Здесь хорошо работает index :

library(zoo)
data(AirPassengers)
APZ = zoo(AirPassengers)
ndx = which.max(APZ)

dmax = index(APZ[ndx])
# returns '1960.5' which is Jul 1960 once you know the series freq

frequency(APZ)
# returns 12

Я предположил, что вы работаете с объектом временной серии;для тех (объекты, созданные с использованием, например, ts , zooreg , xts ) даты фактически являются индексами значений.Если вместо этого у вас есть фрейм данных (то есть date - это столбец во фрейме данных, а значение - другой столбец), вы можете просто получить доступ к строке напрямую.

Редактировать в свете комментария ОП ниже.Для данных, хранящихся в виде фрейма данных:

Предположим, ваши данные выглядят так: фрейм данных, D0:

D0[1:10,]
# returns

          Time       Value
1  2011-03-12 10:48:24   -3.077784
2  2011-03-12 10:49:24  -20.145500
3  2011-03-12 10:50:24  -45.047560
4  2011-03-12 10:51:24  -69.949640
5  2011-03-12 10:52:24  -94.571920
6  2011-03-12 10:53:24 -112.199200
7  2011-03-12 10:54:24 -118.914400
8  2011-03-12 10:55:24 -114.997200
9  2011-03-12 10:56:24  -97.369900
10 2011-03-12 10:57:24  -78.063800

ndx = which.max(D0$Value)
dmax = D0[ndx,]         # dmax gives the date corresponding to the max value
...