我在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.
答案 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))
如果您只想存储数字,也可以保留矩阵结构。此外,您应该避免使用cbind
,rbind
和其他函数,这些函数会在循环中每次迭代时增加对象的大小。 R inferno是一本很好读的书。
答案 2 :(得分:0)
您所寻找的可能是eval
和parse
,因此:
for (i in 1:100) {
eval(parse(text = paste0('a$colum', i, ' <- whatever_you_want_your_column_to_contain'))
}
这将在一个语句中创建命名列及其内容。