2017-06-15 56 views
1

我的問題很簡單,但我不能得到它的工作(儘管搜索)...我是一個新手到R.'for'循環在列名與多個數字,R

我有一個具有光測量的數據幀。在樹冠下的測量是沿着4個樣線進行的,每個樣線的13個位置。在每個樣線上進行一次冠層以上的測量。

df$below_position_1_transect_1 
df$below_position_2_transect_1 
# Et cetera with position 1:13 and transect 1:4 

df$above_transect_1 
df$above_transect_2 
# Et cetera with transect 1:4 

我想對這些列執行一個簡單的函數,並將結果放入正確命名的新列中。總共應該有13 * 4個新列。

lightavailable <- function(below,above) {below/above * 100} 

for (i in c(1:13)) { 
    for (j in c(1:4)) { 
    df[,i] <- lightavailable(
     below = df[,paste0("below_position_",i,"_transect_",j)], 
     above = df[,paste0("above_transect_",j)] 
    ) 
    colnames(df)[i] <- paste0("transmitted_transect_",j,"_position_",i) 
    } 
} 

因此,增加了13個新的列,但僅適用於橫斷面4,這意味着從橫斷面1到3的結果被覆蓋。我相信它與將所有內容寫入df [,i]有關,但我不知道如何解決它。

應該如何編輯代碼,以便爲橫斷面和位置的所有組合創建新列?

謝謝!

+0

您可以分享一些樣本數據並告訴我們預期的結果應該如何。看看這個帖子尋求幫助:https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – Phil

+0

謝謝你,菲爾,我會確保下次再這樣做。問題現在已經解決了。 – Eva

回答

1

而不是試圖找出您的新列將會有什麼整數索引,只需使用df[["string"]]語法命名該列即可。

for (i in c(1:13)) { 
    for (j in c(1:4)) { 
     #---- new variable name -----------------------# 
    df[[paste0("transmitted_transect_",j,"_position_",i)]] <- 
     lightavailable(
     below = df[,paste0("below_position_",i,"_transect_",j)], 
     above = df[,paste0("above_transect_",j)] 
    ) 
    } 
} 
+0

是的!非常感謝Benjamin,這非常完美! – Eva