这并没有明确地回答你的问题,但是展示了如何使用cut
创建你想要的数据来创建“访问”,然后计算唯一的访问次数。
library(data.table)
set.seed(1234)
dat <- data.table(visit_time = sample(20, 100, replace = TRUE),
id = sample(LETTERS[1:5], 100, replace = TRUE))
dat[ , visit := cut(visit_time, breaks = seq(0, 20, 5))]
dat[ , list(nvisits = length(unique(visit))), by = id]
# id nvisits
# 1: A 4
# 2: C 4
# 3: B 4
# 4: D 4
# 5: E 4
运行下面的节目,他们同样时间跨度/就诊中有多少时间是在该位置:
dat[ , .N, by = list(id, visit)]
# id visit N
# 1: A (0,5] 6
# 2: C (10,15] 5
# 3: B (10,15] 6
# 4: A (15,20] 3
# 5: A (10,15] 5
# 6: D (10,15] 6
# 7: E (5,10] 7
# 8: B (5,10] 6
# 9: E (15,20] 4
# 10: D (0,5] 6
# 11: D (5,10] 4
# 12: E (0,5] 9
# 13: C (0,5] 4
# 14: B (15,20] 1
# 15: C (15,20] 9
# 16: B (0,5] 6
# 17: A (5,10] 2
# 18: C (5,10] 5
# 19: D (15,20] 2
# 20: E (10,15] 4
编辑显示切换功能将如何随时间的工作:
我从this excellent answer取randTime
功能。
randTime <- function(N, st, et) {
st <- as.POSIXct(st)
et <- as.POSIXct(et)
dt <- as.numeric(difftime(et,st,unit="sec"))
ev <- sort(runif(N, 0, dt))
rt <- st + ev
rt
}
set.seed(1234)
st <- as.POSIXct("2012/01/01 12:00")
et <- as.POSIXct("2012/01/01 18:00")
dat2 <- data.table(visit_time = randTime(100, st, et),
id = sample(LETTERS[1:5], 100, replace = TRUE))
dat2[ , visit := as.character(cut(visit_time, breaks = seq(st, et, "15 min")))]
dat2[ , length(unique(visit)), by = id]
# id V1
# 1: A 11
# 2: C 13
# 3: B 14
# 4: D 14
# 5: E 14
你只要做,然后追加到它。这就是动态语言如何做到的。这对于那些需要复制的大列表正在扩大的问题更重要。更多的小向量和值R已经在你背后占据了主导地位。 –
这听起来有点像你只是想融化和过滤......没有一个特定的数据例子,但它很难知道。 –
我建议你第2章“成长对象”,它正是你要求的:) http://www.burns-stat.com/pages/Tutor/R_inferno。pdf他提出的解决方案是由@Roland提出的解决方案,但他也分析了系统时间用于完成某些任务的其他方法(在块中与在rbind与下标之间增长)。 You cn – Eugen