【问题标题】:Why rbind does not work in function loop in R为什么 rbind 在 R 的函数循环中不起作用
【发布时间】:2018-09-07 07:58:24
【问题描述】:

我正在计算多个栅格中的影响百分比。我有一个带有整个变量总和(SUM)的栅格。然后我有 9 个要循环的栅格并计算影响的百分比(变量)。我正在使用该功能,因为我将使用不同的输入。当函数停止时,我想要一个文本文件或任何可以导出的文件。我尝试使用 rbind() 但它不起作用,当函数执行时它总是空的。这是代码:

Var_Sum_Impact(EU_HS_45_2041_SUM.r[[1]], EU_HS_45_2041_Var_Medi_Steppic.r)

results = data.frame(col1=numeric(), stringsAsFactors=FALSE)

Var_Sum_Impact = function(SUM, Variables) {
  for (i in 1:9){
    Var = cellStats(Variables[[i]], stat='mean')
    Su = cellStats(SUM, stat='mean')
    Perc = Var/(Su/100)
    print(Perc)
    results = rbind(results, Perc)
    }
}

这是我从该打印中得到的结果,但“结果”为空(0 obs。)。计算正确:

[1] 9.418741
[1] 20.39071
[1] 12.96036
[1] 5.910591
[1] 4.998413
[1] 21.37485
[1] 6.379199
[1] 4.383655
[1] 14.18348

【问题讨论】:

  • 试试results$col1[i] <- Perc
  • 谢谢文森特。我还在函数中添加了 return 我得到了这个(看起来是正确的,但是当我写 View(results) 时结果仍然是空的): col1 1 9.418741 2 20.390715 3 12.960364 4 5.910591 5 4.998413 6 21.374847 7 6.379199 8 4.38334655.

标签: r function for-loop rbind


【解决方案1】:

rbind 在此处未按预期工作,因为您正在尝试将数据框绑定到向量。因此,您需要将 Perc 设为数据框(或将结果设为向量并使用 c() 加入每次迭代)。您还需要在 for 循环之后返回结果。

我也认为实例化结果应该发生在你的函数内部

我认为这应该可以工作(但还没有运行):

Var_Sum_Impact = function(SUM, Variables) {
  results = data.frame(col1=numeric(), stringsAsFactors=FALSE)
  for (i in 1:9){
    Var = cellStats(Variables[[i]], stat='mean')
    Su = cellStats(SUM, stat='mean')
    Perc = data.frame(col1 = Var/(Su/100), stringsAsFactors = FALSE)
    print(Perc)
    results = rbind(results, Perc)
    }
    results # return results
}
## call this after your function, right?
Var_Sum_Impact(EU_HS_45_2041_SUM.r[[1]], EU_HS_45_2041_Var_Medi_Steppic.r)

我还会考虑在 Variables 对象上使用 lapply:

results_l <- lapply(Variables, function(V) {
        Var = cellStats(V, stat='mean')
        Su = cellStats(SUM, stat='mean')
        data.frame(col1 = Var/(Su/100), stringsAsFactors = FALSE)
}) ## produces a list of data frames you can rbind together
results <- do.call(rbind, results_l)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-16
    • 2020-08-25
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    相关资源
    最近更新 更多