当您提前不知道长度时如何在 R 中创建向量?

ore*_*ano 2 r vector append dataframe

我读过附加到 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
Run Code Online (Sandbox Code Playgroud)

我想创建一个新的数据框,其中每个条目都是一个人的“访问”,整理来自一个人的时间接近的任何条目。

#    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
Run Code Online (Sandbox Code Playgroud)

对于第一个数据框中的一个人,它们可能是 50 个条目,在新数据框中可以整理成 3 个“访问”。我不知道有多少“访问”。那么我应该如何创建这个数据框呢?

我知道 rbind,但在这种情况下,我将一一绑定每一行。这是一个好主意吗?

另一种选择是遍历第一个数据帧两次,一次是为了确定第二个数据帧的大小,然后再填充它,但这似乎效率更低。

Rol*_*and 5

我不相信你需要这个(可能有一个更好的解决方案来解决你描述不佳的实际问题),但我会在第一段回答这个问题。如果您不知道结果向量需要多大,您可以将其初始化为合理的大小,并根据需要分块增长。这限制了向量需要增长的时间。

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)]
Run Code Online (Sandbox Code Playgroud)

你实际上在现实生活中做了类似的事情。如果你买了一个新书架,你就买得足够大,这样你就有足够的空间来买未来的书了。当它已满时,您购买下一个(或更大的)。