2012-01-25 78 views
5

Tôi có tập dữ liệu đại diện cho dữ liệu từ tệp nhật ký hiển thị cho người dùng và máy dùng kết nối cho máy chủ. Tôi có một thời gian kết nối bắt đầu (biến start) và thời gian kết thúc (biến kết thúc) trong tập dữ liệu:Cách đếm số lượng người dùng đồng thời sử dụng dữ liệu khoảng thời gian?

tdata <- structure(list(username = structure(c(9L, 6L, 7L, 5L, 3L, 2L, 
4L, 8L, 1L, 4L), .Label = c("ESSAA", "HBRTE", "HPAIUS", 
"KOLA", "MAITAEN", "MARKEA", "MIAINN", "MSALA", 
"PAREDT"), class = "factor"), machine = structure(c(3L, 2L, 
4L, 8L, 1L, 5L, 9L, 6L, 7L, 9L), .Label = c("D5785.domain.com", 
"D5874.domain.com", "D5927.domain.com", "D6000.domain.com", 
"D6092.domain.com", "D6147.domain.com", "D6142.domain.com", 
"D6169.domain.com", "D6194.domain.com"), class = "factor"), 
    start = structure(c(1322672567, 1322687984, 1322465646, 1322696883, 
    1322695042, 1322697073, 1322697547, 1322692794, 1322697694, 
    1322700934), tzone = "", class = c("POSIXct", "POSIXt")), 
    end = structure(c(1322693766, 1322695797, 1322696945, 1322697004, 
    1322697284, 1322697303, 1322697781, 1322700307, 1322700667, 
    1322701224), tzone = "", class = c("POSIXct", "POSIXt"))), .Names = c("username", 
"machine", "start", "end"), row.names = c(NA, 10L), class = "data.frame") 

> tdata 
    username   machine    start     end 
1 PAREDT D5927.domain.com 2011-11-30 19:02:47 2011-12-01 00:56:06 
2 MARKEA D5874.domain.com 2011-11-30 23:19:44 2011-12-01 01:29:57 
3 MIAINN D6000.domain.com 2011-11-28 09:34:06 2011-12-01 01:49:05 
4 MAITAEN D6169.domain.com 2011-12-01 01:48:03 2011-12-01 01:50:04 
5 HPAIUS D5785.domain.com 2011-12-01 01:17:22 2011-12-01 01:54:44 
6  HBRTE D6092.domain.com 2011-12-01 01:51:13 2011-12-01 01:55:03 
7  KOLA D6194.domain.com 2011-12-01 01:59:07 2011-12-01 02:03:01 
8  MSALA D6147.domain.com 2011-12-01 00:39:54 2011-12-01 02:45:07 
9  ESSAA D6142.domain.com 2011-12-01 02:01:34 2011-12-01 02:51:07 
10  KOLA D6194.domain.com 2011-12-01 02:55:34 2011-12-01 03:00:24 
> 

Bây giờ tôi muốn để tính toán số lượng người dùng đồng thời cho mỗi phút sử dụng bắt đầu và kết thúc thời gian từ bộ dữ liệu tdata. Tôi đã nhận được điều này đến nay:

#create dataset containing each minute from tdata 
start.min <- min(tdata$start, na.rm=T) 
end.max <- max(tdata$end, na.rm=T) 
tinterval <- seq.POSIXt(start.min, end.max, by = "mins") 

Bất kỳ ý tưởng nào để tiến hành tính toán?

Trả lời

5

Dưới đây là một ví dụ

n <- sapply(tinterval, function(tt) sum(tdata$start <= tt & tt <= tdata$end)) 

sau đó

@> tail(data.frame(tinterval, n)) 
       tinterval n 
3922 2011-12-01 09:55:06 0 
3923 2011-12-01 09:56:06 1 
3924 2011-12-01 09:57:06 1 
3925 2011-12-01 09:58:06 1 
3926 2011-12-01 09:59:06 1 
3927 2011-12-01 10:00:06 1 
@> plot(tinterval, n, type = "l") 

khá chậm mặc dù ...

+0

Bạn đã tìm ra giải pháp để tăng tốc độ? Tôi đang làm như vậy ở đây, tuy nhiên tôi đang đối phó với giây và dữ liệu trong một năm - vì vậy đây là cách quá chậm. –

3

Chỉ cần cho đá, đây là một giải pháp XTS:

library(xts) 
# create an empty xts object with the minute timestamps we're interested in 
out <- xts(,align.time(tinterval,60)) 
# loop over each user 
for(i in 1:NROW(tdata)) { 
    # paste the start/end times into an xts-style range 
    timeRange <- paste(format(tdata[i,c("start","end")]),collapse="/") 
    # add the minute "by parameter" for timeBasedSeq 
    timeRange <- paste(timeRange,"M",sep="/") 
    # create the by-minute sequence and align to minutes to match "out" 
    timeSeq <- align.time(timeBasedSeq(timeRange),60) 
    # create xts object with "1" entries for times between start and end 
    temp <- xts(rep(1,length(timeSeq)),timeSeq) 
    # merge temp with out and fill non-matching timestamps with "0" 
    out <- merge(out, temp, fill=0) 
} 
# add column names (if necessary) 
colnames(out) <- tdata[,1] 
# sum across rows (need xts constructor because rowSums returns a matrix) 
counts <- xts(rowSums(out),index(out)) 
Các vấn đề liên quan