2015-04-01 145 views
1

我在R中有一个数据框,我想在for循环中创建新列。过去两天我尝试了很多东西,但没有成功。最后,我确实找到了一个似乎可行的解决方案,但看起来并不那么直截了当。我想知道是否有人有更优雅的方式来做到这一点。
对不起,如果这已经解决,但我找不到类似的问题SO
这是我的例子。在for循环中在R中创建列

x <- runif(20) 
a <- as.data.frame(x) 
for (i in 1:100){ 
    d <- x + i 
    a <- cbind(a, d) 
} 

c <- 1 
for (i in 1:100){ 
    c[i] <- paste0("colum", i) 
    } 
colnames(a) <- c("x", c) 

预先感谢任何好的建议,使所有内一个环而不是2

+1

一方面,可以彻底删除第二个for循环。 'paste0(“colum”,1:100)'给出了相同的结果。 – 2015-04-01 20:58:44

+0

哦,是的。感谢那。然后,我稍微编辑问题。 – Franky 2015-04-01 21:00:30

回答

0

在这种情况下,你可以同时避免循环这个过程。在R中,您应该尽可能使用向量化语句。在这种情况下,你可以很容易做到这一点使用另外,一种方式是

result <- matrix(x + rep(0:100, length(x)), ncol = 101, byrow = TRUE) 
result <- as.data.frame(result) 
names(result) <- c("x", paste0("column", 1:100)) 

您也可以保持矩阵结构,如果你只想要存储号码。另外,您应该避免使用cbind,rbind和其他函数,这些函数在循环中每次迭代都会增加对象的大小。 R地狱是一本好书。

2

也许你在找什么是evalparse,因为这样的:

for (i in 1:100) { 
    eval(parse(text = paste0('a$colum', i, ' <- whatever_you_want_your_column_to_contain')) 
} 

这将在一个单独的语句创建一个名为列及其内容。

+0

但是不要忘记阅读:'fortunes :: fortune(106)' – 2015-04-01 23:04:41

+0

我该如何处理在这种情况下只分配单行的问题?例如,当我在每个循环中创建不同的列及其名称时,我想为每列的某些行分配不同的数字。 – Ben 2018-01-11 10:45:29

0

为什么不:

a[2:11] <- sapply(1:10, "+", a[[1]]) 

的名称是:

names(a) <- c("x", paste0("column", 1:10))