【问题标题】:R: How to create a loop for, for a range of data in a function?R:如何为函数中的一系列数据创建循环?
【发布时间】:2016-03-01 10:51:26
【问题描述】:

我有这个参数:

L_inf <- seq(17,20,by=0.1)

还有这个功能:

fun <- function(x){
  L_inf*(1-exp(-B*(x-0)))}

我会将此函数应用于L_inf 的值范围。 我试过循环for,像这样:

A <- matrix() # maybe 10 col and 31 row or vice versa
for (i in L_inf){
A[i] <- fun(1:10)
}

Bur R 回复:longer object length is not a multiple of shorter object length。 我的预期输出是一个矩阵(或数据框,或者可能是列表),对于向量L_inf(长度=31)的每个值,有 10 个结果(fun(1:10))。 怎么办?

【问题讨论】:

    标签: r function for-loop


    【解决方案1】:

    您正试图将一个包含 10 个元素的向量放入其中一个矩阵单元中。您想将其分配给矩阵行(您可以使用A[i,] 访问第 i 行)。

    但在这种情况下使用 for 循环效率低下,使用“apply”函数之一非常简单。 Apply 函数通常返回一个列表(这是最通用的容器,因为基本上没有约束)。

    这里的sapply 是一个应用函数,它试图S将其结果简化为一个方便的数据结构。在这种情况下,由于所有结果的长度相同 (10),sapply 会将结果简化为矩阵。

    请注意,我修改了您的函数,使其显式依赖于 L_inf。否则它不会做你认为应该做的事情(如果你想了解更多信息,请参阅关键字“闭包”)。

    L_inf_range <- seq(17,20,by=0.1)
    B <- 1
    
    fun <- function(x, L_inf) {
        L_inf*(1-exp(-B*(x-0)))
    }
    
    sapply(L_inf_range, function(L) fun(1:10, L_inf=L))
    

    【讨论】:

    • ,我想测试时间序列数据的平稳性,建立ARIMA模型,预测,每30行时间序列,我该怎么做?我在同一个变量下有多个长格式的时间序列数据,一个时间序列有 30 年的数据,我想将 30 年的时间序列复制到 4 个,即 4*30=120 个观察值。非常感谢您的帮助!
    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多