如何在R不知道时间的情况下在R中创建矢量?
I have read附加到R中的向量是不好的做法。在那种情况下,当我想创建一个矢量时,我应该怎么做,但是我不知道它的长度?如何在R不知道时间的情况下在R中创建矢量?
我正在查看一个数据框,其中包含有关人们何时靠近特定位置的条目。每个条目都包含关于该人的信息以及附近的时间,但是对于单个人可能有许多条目。
# loc id time
# 1: z A 00:00
# 2: z A 00:01
# 3: z B 00:02
# 4: z A 00:02
# 5: z C 00:05
# 6: z C 00:07
# 7: z A 00:08
# 8: z A 00:09
# 9: z C 00:09
#10: z C 00:10
我想创建一个新的数据帧,其中每个条目是“拜访”的人,从一个人是在时间上接近整理的任何条目。
# loc id starttime endtime
# 1: z A 00:00 00:02
# 2: z C 00:05 00:07
# 3: z A 00:08 00:09
# 4: z C 00:09 00:10
它们可以是一个人在第一数据帧可被整理成在新的数据帧3“访问” 50个条目。事先我不知道有多少“访问”。那么我应该如何去创建这个数据框呢?
我知道rbind,但在这种情况下,我会逐一绑定每一行。这是一个好主意吗?
另一种选择是通过第一个数据帧两次,一次找出第二个数据帧的大小,然后再填充它,但这看起来效率更低。
我不相信你需要这个(可能有更好的解决方案来描述你的实际问题),但我会在第一段回答这个问题。如果您不知道结果向量需要多大,则将其初始化为合理的大小,并根据需要将其大小分块。这限制了向量需要增长的时间。
set.seed(42)
vec <- numeric(100) #initialize a chunk
i <- 0
repeat {
test <- rnorm(1)
if (test > 3) break
i <- i + 1
#grow in chunks:
if (length(vec) < i) vec <- c(vec, numeric(100))
vec[i] <- test
}
#shorten to final length
vec <- vec[seq_len(i)]
你在实际生活中实际上做了这样的事情。如果你购买一个新的书架,你可以买到足够大的书架,以备将来购买书籍。当它满了,你买下一个(或更大的)。
我从来没有见过“重复” - 非常优雅! – dayne
这并没有明确地回答你的问题,但是展示了如何使用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