1

在其他 R 代码中,通常会在循环开始之前看到 data.frame 声明。假设我有 2000 行的数据框 data1。在一个循环中,我通过 web 服务循环 data1 来创建一个新的 data.frame data2。(请不要推荐不使用循环)。在 data2$result 和 data2$pubcount 中,我需要为 2000 个 data1 项目中的每一个存储不同的值。

我必须在循环之前声明吗

data2=data.frame()

我是否必须告诉 R 我稍后将使用多少行和哪些列?我知道可以在不声明的情况下添加列。行呢。这样做有没有优势:

data2<-data.frame(id=data1$id)

我只想做我绝对必须声明和做的事情。为什么空声明在循环中给出错误一次?

稍后编辑:速度和内存不是问题。10s 与 30s 没有区别,我有一个不到 100MB 的数据和大型 PC (8GB)。矩阵不是一个选项,因为数据是数字和文本(混合),所以我必须使用非矩阵。

4

1 回答 1

3

像这样的东西:

df <- data.frame(a=numeric(n),b=character(n))

for (i in 1:n) {

#<do stuff>
df[i,1] <- ...
df[i,2] <- ...

}

您应该避免在循环中操作 data.frames,因为 data.frames 的子集化是一个缓慢的操作:

a <- numeric(n)   
b <- character(n) 

for (i in 1:n) {

#<do stuff>
a[i] <- ...
b[i] <- ...

}
df <- data.frame(a,b)

当然,通常有比for循环更好的方法。但强烈建议避免增长对象(我不会教你如何做到这一点)。如此处所示预分配。

为什么要预先分配?因为在循环中增长对象很慢,这也是人们认为 R 中的循环很慢的主要原因之一。

于 2013-01-30T16:37:49.663 回答