在for循环中在R中创建列

时间:2015-04-01 20:56:12

标签: r for-loop

我在R中有一个数据框,我想在for循环中创建新列。我在过去的两天里尝试了很多东西但没有成功。最后,我确实找到了一个似乎有效的解决方案,但它似乎并不是很直接。我想知道是否有人有更优雅的方式来做这件事 很抱歉,如果已经解决了这个问题,但我找不到类似的问题 这是我的例子。

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.

3 个答案:

答案 0 :(得分:2)

为什么不:

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

名称将是:

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

答案 1 :(得分:1)

在这种情况下,您可以避免两个循环。在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))

如果您只想存储数字,也可以保留矩阵结构。此外,您应该避免使用cbindrbind和其他函数,这些函数会在循环中每次迭代时增加对象的大小。 R inferno是一本很好读的书。

答案 2 :(得分:0)

您所寻找的可能是evalparse,因此:

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

这将在一个语句中创建命名列及其内容。