2013-02-11 1 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) 

하루 동안 만 데이터를 남기고 싶습니다. 이 날은 해당 날짜에 가장 많은 수의 데이터 요소를 가짐으로써 선택됩니다. 어떤 이유로 든 최대 2 일간의 데이터 묶음 (최대 데이터 수)이있는 경우 가장 높은 개인 가치가 기록 된 요일을 선택하고 싶습니다.

위에서 주어진 예제 데이터 프레임에서는 12 월 7 일로 남았습니다 (12 월 5 일과 같이) 4 개의 데이터 포인트가 있지만이 두 날짜 (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 
관련 문제