首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从R中的for循环写入数据帧

从R中的for循环写入数据帧
EN

Stack Overflow用户
提问于 2010-04-02 05:30:45
回答 4查看 68.1K关注 0票数 17

我正在尝试从循环写入R中的数据帧,例如像this>这样的循环

代码语言:javascript
复制
for (i in 1:20) {
print(c(i+i,i*i,i/1))}

并将每行3个值写入具有三列的数据帧,以便每次迭代都采用新的行。我尝试过使用矩阵、ncol=3和按行填充,但只从循环中获得了最后一项。

谢谢。

EN

回答 4

Stack Overflow用户

发布于 2010-04-02 06:14:55

您可以使用rbind:

代码语言:javascript
复制
d <- data.frame()
for (i in 1:20) {d <- rbind(d,c(i+i, i*i, i/1))}
票数 24
EN

Stack Overflow用户

发布于 2012-06-29 17:31:21

另一种方法是

代码语言:javascript
复制
do.call("rbind", sapply(1:20, FUN = function(i) c(i+i,i*i,i/1), simplify = FALSE))


     [,1] [,2] [,3]
 [1,]    2    1    1
 [2,]    4    4    2
 [3,]    6    9    3
 [4,]    8   16    4
 [5,]   10   25    5
 [6,]   12   36    6

如果不指定simplify = FALSE,则必须使用t转置结果。对于大型结构,这可能会很繁琐。

如果您有一个较大的数据集,并且/或者您需要多次重复此操作,则此解决方案尤其方便。

我在这个“线程”中提供了一些解决方案的时间。

代码语言:javascript
复制
> system.time(do.call("rbind", sapply(1:20000, FUN = function(i) c(i+i,i*i,i/1), simplify = FALSE)))
   user  system elapsed 
   0.05    0.00    0.05 

> system.time(ldply(1:20000, function(i)c(i+i, i*i, i/1)))
   user  system elapsed 
   0.14    0.00    0.14 

> system.time({d <- matrix(nrow=20000, ncol=3) 
+ for (i in 1:20000) { d[i,] <- c(i+i, i*i, i/1)}})
   user  system elapsed 
   0.10    0.00    0.09 

> system.time(ldply(1:20000, function(i)c(i+i, i*i, i/1)))
   user  system elapsed 
  62.88    0.00   62.99 
票数 10
EN

Stack Overflow用户

发布于 2010-04-02 06:17:33

For循环有副作用,因此通常的做法是在循环之前创建一个空的dataframe,然后在每次迭代时添加到其中。您可以将其实例化为正确的大小,然后在每次迭代中将您的值分配给第i行,或者添加到它并使用rbind()重新分配整个内容。

前一种方法对于大型数据集将具有更好的性能。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2563824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档