Пусть у меня будут следующие данные:

time <- seq(ISOdate(2007,7,1,0), ISOdate(2008,4,5,23), by = "1 hour")
y <- rnorm(n = length(time))

year  <- as.numeric(substr((as.character(time)), 1, 4))  # year number as numeric

month <- as.numeric(substr((as.character(time)), 6, 7))  # month number as numeric

day <- as.numeric(substr((as.character(time)), 9, 10))  # day number as numeric

hour <- as.numeric(substr((as.character(time)), 12, 13))  # hour number as numeric

dat <- data.frame(year=year, month=month, day=day, hour=hour, y = y)

Для каждого дня существует 24 значения y в каждый час (от 0 до 23). Теперь мне нужно найти максимум y на каждый день. То есть, скажем, для даты "2007-10-05" есть 24 значения y, полученных за каждый час (от 0 до 23), и я должен получить максимальное значение для дня "2007-10-05 ". Следовательно, поскольку между «2007-07-01» и «2008-04-05» есть 279 дней, я получу 279 максимальных значений y.

Как я могу это сделать?

r
0
user 31466 14 Май 2016 в 15:18

3 ответа

Лучший ответ

Используя dplyr,

library(dplyr)
dyp1 <- dat %>% 
        group_by(year, month, day) %>% 
        summarise(y=max(y))

Используя data.table,

library(data.table)
setDT(dat)[, .(y=max(y)), by = .(year, month, day)]

Используя базу R,

aggregate( y ~ year+month+day, dat, max)
3
Sotos 14 Май 2016 в 12:37

Используя sqldf

library(sqldf)
sqldf("select year, month, day, 
       max(y) as y 
       from dat 
       group by year, month, day") 

Или другой вариант - заказать y и выбрать первое значение

library(data.table)
setDT(dat)[order(-y), .(y= y[1L]), by = .(year, month, day)]

Или с dplyr

library(dplyr)
dat %>%
    group_by(year, month, day) %>%
    arrange(desc(y)) %>%
    summarise(y = first(y))  
2
akrun 14 Май 2016 в 15:31

Примените команду cut непосредственно к массиву времени и y:

tapply(y, INDEX =cut(time, breaks="day"), max)

Или используя библиотеку dplyr:

library(dplyr)
df<-data.frame(time, y)
summarize(group_by(df, cut(df$time, breaks="day")), max(y))
1
Dave2e 14 Май 2016 в 15:36