'for' 在名称中包含多个数字的列上循环,R
'for' loop on columns with multiple numbers in name, R
我的问题很简单,但我无法让它工作(尽管进行了搜索)...我是 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] 有关,但我不确定如何修复它。
应如何编辑代码以便为样带和位置的所有组合创建新列?
谢谢!
与其试图找出新列的整数索引,不如使用 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)]
)
}
}
我的问题很简单,但我无法让它工作(尽管进行了搜索)...我是 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] 有关,但我不确定如何修复它。
应如何编辑代码以便为样带和位置的所有组合创建新列?
谢谢!
与其试图找出新列的整数索引,不如使用 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)]
)
}
}