2017-06-15 51 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