3

大規模なデータセットを使用しています。例を以下に示します。個々のファイルの大部分については、処理する必要があり、1日以上のデータが必要です。

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日が残ります。4つのデータポイントがありますが(12月5日と同様)、この2日間で記録された値が最も高くなります(つまり10)。

4

3 に答える 3

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
于 2013-02-11T13:17:49.233 に答える
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
于 2013-02-11T13:26:02.970 に答える
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
于 2013-02-11T13:33:27.663 に答える