2013-02-11 2 views
3

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

Date <- c("05/12/2012 05:00:00", "05/12/2012 06:00:00", "05/12/2012 07:00:00", 
      "05/12/2012 08:00:00", "06/12/2012 07:00:00", "06/12/2012 08:00:00", 
      "07/12/2012 05:00:00", "07/12/2012 06:00:00", "07/12/2012 07:00:00", 
      "07/12/2012 08:00:00") 
Date <- strptime(Date, "%d/%m/%Y %H:%M") 
c <- c("0","1","5","4","6","8","0","3","10","6") 
c <- as.numeric(c) 
df1 <- data.frame(Date,c,stringsAsFactors = FALSE) 

Я хочу только оставить данные в течение одного дня. Этот день будет выбран с учетом максимального количества точек данных за этот день. Если по какой-либо причине привязаны два дня (с максимальным количеством точек данных), я хочу выбрать день с самым высоким индивидуальным значением, записанным.

В приведенном выше примере данных, я остался с 7 декабря. Он имеет 4 точки данных (как и 5 декабря), но имеет самое высокое значение, записанное за эти два дня (т. Е. 10).

ответ

4

Вот решение с tapply.

# count rows per day and find maximum c value 
res <- with(df1, tapply(c, as.Date(Date), function(x) c(length(x), max(x)))) 

# order these two values in decreasing order and find the associated day 
# (at top position): 
maxDate <- names(res)[order(sapply(res, "[", 1), 
          sapply(res, "[", 2), decreasing = TRUE)[1]] 

# subset data frame: 
subset(df1, as.character(as.Date(Date)) %in% maxDate) 

        Date c 
7 2012-12-07 05:00:00 0 
8 2012-12-07 06:00:00 3 
9 2012-12-07 07:00:00 10 
10 2012-12-07 08:00:00 6 
4

data.table решение:

dt <- data.table(df1) 
# get just the date 
dt[, day := as.Date(Date)] 
setkey(dt, "day") 
# get total entries (N) and max(c) for each day-group 
dt <- dt[, `:=`(N = .N, mc = max(c)), by=day] 
setkey(dt, "N") 
# filter by maximum of N 
dt <- dt[J(max(N))] 
setkey(dt, "mc") 
# settle ties with maximum of c 
dt <- dt[J(max(mc))] 
dt[, c("N", "mc", "day") := NULL] 
print(dt) 

#     Date c 
# 1: 2012-12-07 05:00:00 0 
# 2: 2012-12-07 06:00:00 3 
# 3: 2012-12-07 07:00:00 10 
# 4: 2012-12-07 08:00:00 6 
3

И быть полным, вот один с plyr:

library(plyr) 
df1$day <- strftime(df1$Date, "%d/%m/%Y") 
tmp <- ddply(df1[,c("day","c")], .(day), summarize, nb=length(c), max=max(c)) 
tmp <- tmp[order(tmp$nb, tmp$max, decreasing=TRUE),] 
df1[df1$day==tmp$day[1],] 

Что дает:

    Date c  day 
7 2012-12-07 05:00:00 0 07/12/2012 
8 2012-12-07 06:00:00 3 07/12/2012 
9 2012-12-07 07:00:00 10 07/12/2012 
10 2012-12-07 08:00:00 6 07/12/2012 
Смежные вопросы