2013-01-14 33 views
5

關於R最令人沮喪的事情之一是難以通過算法和直觀方式使用名稱創建新的數據框變量。使用循環和命名約定在數據框中創建新的命名變量

假設我有一個數據框與一些變量,並希望在循環中基於它們創建新的變量。例如,我要創建新的變量,是現有變量的累積和,並命名爲df$var_cumul

temp<-as.data.frame(cbind(seq(0:10),seq(10:20))) 
names(temp)<-c("x","y") 
for (i in 1:ncol(temp)) { 
    vname<-names(temp)[i] 
    assign(paste("temp$",vname,"_cumul",sep=""),cumsum(contrs[,i])) 
} 

的,我已經找到工作沒有permuation。這可能是R經常遇到的最大問題之一。

有沒有一種簡單直觀的方法來做到這一點?

+2

你需要學習的幫助頁面 「[[」 更仔細。關鍵是避免無用的努力來使'$ < - '做一些它不能做的事情。如果你沒有學習'as.data.frame(cbind(...))' –

+1

..也永遠不會使用'1:ncol','1:nrow'或'1:length',這也會有所幫助。 ..(它不會做你認爲它做的事情,這種情況是一個痛苦的調試...) - 你想使用'seq_len()'和朋友。 –

+0

隨着迪文的第二點,我認爲他指的是'data.frame(x = 1:11,y = 1:11)'是(除其他之外)很少打字。我會認真地推薦玩像'seq(10:20)'這樣的輸出,因爲那太糟糕了。 (閱讀'seq'將是一個好的開始。) – joran

回答

5

是的,[[操作:

temp <- data.frame(x = 0:10, y = 10:20) 

for (n in names(temp)) 
    temp[[paste0(n, "_cumsum")]] <- cumsum(temp[[n]]) 
+0

如果我想創建3個數據幀,我可以在for循環中創建它嗎?我的例子是 (我在1:3中) { df.i < - data.frame(something) } –