小编典典

将值附加到R中的空向量?

all

我正在尝试学习 R,但我不知道如何附加到列表中。

如果这是 Python,我会 . . .

#Python
vector = []
values = ['a','b','c','d','e','f','g']

for i in range(0,len(values)):
    vector.append(values[i])

你如何在 R 中做到这一点?

#R Programming
> vector = c()
> values = c('a','b','c','d','e','f','g')
> for (i in 1:length(values))
+ #append value[i] to empty vector

阅读 60

收藏
2022-07-27

共1个答案

小编典典

在 for 循环中附加到一个对象会导致整个对象在每次迭代时都被复制,这导致很多人说“R 很慢”,或者“应该避免 R 循环”。

正如在评论中提到的:最好预先分配一个所需长度的向量,然后在循环中设置元素值。

这里有几种将值附加到向量的方法。他们都很气馁。

在循环中附加到向量

# one way
for (i in 1:length(values))
  vector[i] <- values[i]
# another way
for (i in 1:length(values))
  vector <- c(vector, values[i])
# yet another way?!?
for (v in values)
  vector <- c(vector, v)
# ... more ways

help("append")会回答你的问题并节省你写这个问题的时间(但会导致你养成坏习惯)。;-)

请注意,这vector <- c()不是一个空向量;它是NULL。如果您想要一个空字符向量,请使用vector <- character().

循环前预分配向量

如果 绝对必须 使用 for 循环,则应在循环之前预先分配整个向量。这将比附加更大的向量快得多。

set.seed(21)
values <- sample(letters, 1e4, TRUE)
vector <- character(0)
# slow
system.time( for (i in 1:length(values)) vector[i] <- values[i] )
#   user  system elapsed 
#  0.340   0.000   0.343 
vector <- character(length(values))
# fast(er)
system.time( for (i in 1:length(values)) vector[i] <- values[i] )
#   user  system elapsed 
#  0.024   0.000   0.023
2022-07-27