2015-04-01 49 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))