我正在学习R,但我不知道如何追加到列表中。
如果这是巨蟒,我会......
#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
9条答案
按热度按时间xmakbtuz1#
在for循环中追加对象会导致整个对象在每次迭代时都被复制,这会导致很多人说"R太慢",或者"应该避免R循环"。
正如评论中提到的BrodieG:最好预先分配所需长度的向量,然后在循环中设置元素值。
这里有几种向向量添加值的方法。所有这些方法都是不推荐的。
追加到循环中的向量
help("append")
本可以回答你的问题并节省你写这个问题的时间(但会使你养成坏习惯)。-)注意,
vector <- c()
不是空向量;它是NULL
,如果你想要一个空的字符向量,使用vector <- character()
。循环前预分配向量
如果你绝对必须使用for循环,你应该在循环之前预分配整个向量,这比为更大的向量追加要快得多。
j5fpnvbx2#
FWIW:类似于python的append():
watbbzwu3#
您有几个选项:
append(vector, values)
vector[(length(vector) + 1):(length(vector) + length(values))] <- values
第一种方法是标准方法,第二种方法提供了在结尾以外的地方追加的选项,最后一种方法有点扭曲,但有修改
vector
的优点(尽管实际上,您可以很容易地修改vector <- c(vector, values)
)。注意在R中你不需要循环向量,你可以对它们整体操作。
此外,这是相当基本的东西,所以您应该浏览一些**the references**。
基于OP反馈的更多选项:
qc6wkl3g4#
为了完整起见,在for循环中向向量添加值并不是R的真正理念。正如@BrodieG指出的那样,R将向量作为一个整体来操作效果更好。看看你的代码是否可以重写为:
输出将是返回值的向量。如果值是列表而不是向量,则也可以使用
lapply
。dfuffjeb5#
有时候我们不得不使用循环,例如,当我们不知道需要多少次迭代才能得到结果时,以while循环为例,下面是你绝对应该避免的方法:
这是非常低效的,因为R每次追加时都会复制向量。
最有效的追加方法是使用index,注意这次我让它迭代1e7次,但它仍然比
c
快得多。这是可以接受的。而且我们可以通过将
[
替换为[[
来使它更快一些。也许您已经注意到
length
可能非常耗时。如果我们用一个计数器替换length
:正如其他用户所提到的,预分配向量是非常有用的,但是如果你不知道需要多少个循环才能得到结果,那么这就是速度和内存使用之间的权衡。
一种中间方法是逐步添加结果块。
yrwegjxp6#
在R中,你可以这样尝试:
mm9b1k5b7#
ulydmbyx8#
你在Python代码中使用的是一个列表,它和R向量完全不同,如果我知道你想做什么:
v8wbuo2f9#
在R中,您创建了一个“列表”,它执行以下操作:
v <- numeric()
(是一个数值向量,在Python中是int)v <- character()
(字符向量,Python中为字符串)那么,如果你想添加一个值,你必须这样做:
v[1] <- 10
(附加到向量“v”,在位置“1”中值10)v[2] <- 11
(将值11附加到向量“v”的位置“2”)所以,如果你想在for循环中追加多个值,试试这个: