【问题标题】:'for' loop on columns with multiple numbers in name, R在名称中具有多个数字的列上的“for”循环,R
【发布时间】:2017-11-17 18:32:47
【问题描述】:

我的问题很简单,但我无法让它工作(尽管搜索)...我是 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] 有关,但我不确定如何修复它。

应如何编辑代码以便为样带和位置的所有组合创建新列?

谢谢!

【问题讨论】:

  • 您能否分享一些示例数据并向我们展示预期的结果应该是什么样子。看看这篇文章寻求帮助:stackoverflow.com/questions/5963269/…
  • 谢谢菲尔,我会确保下次这样做。现在问题已经解决了。

标签: r loops for-loop numbers overwrite


【解决方案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)]
      )
  }
}

【讨论】:

  • 是的!非常感谢本杰明,效果很好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
  • 2022-01-16
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 2023-02-08
  • 2015-10-14
相关资源
最近更新 更多