繁体   English   中英

使用循环应用于数据帧的递归函数

[英]Recursive function using loop applied to a data frame

我正在尝试创建一个计算递归形式的函数,该函数将应用于数据框。 我有一个数据框对象,该对象有6列,每列有10行。

Data <- data.frame()
for(i in 1:(10)) {Data  <- rbind(Data ,c(A=i+2,B=sqrt(i),C=1/i,D=i/120,E=i/250,F=i+3)); names(Data ) <- letters[1:6]}

我想使用以下递归函数:

f<-function(x,para,c,d,e){
  #  Constant
  h=0.25

  #para_para<-c() set up the parameters of the model 
  y1=para[1]
  y2=para[2]
  y3=para[3]

  # Terminal condition for the A and B at time T
  A=0
  B=0
  # Recursion back to time t
  steps<-round(d*250,0) 

  for (i in 1:steps){
    A= A+ e*x +y1*B
    B= y2*B+y3 
  }

  f = exp(log(c)*x -A + B*h )
  return(f)
  }

在某些特定值下,该函数起作用:

> para<-c(1,-0.001,0.5)
> W<-f(x=0.5,para,c=0.1,d=0.2,e=0.3)
> W
[1] 4.647528e-15

我想相对于数据框的行将此功能应用于数据框,其中包括: c=Data$c,d=Data$d,e=Data$e 我尝试使用一些警告此代码:

 f(x=0.5,para,c=Data$c,d=Data$d,e=Data$e)
 [1] 0.6844600 0.4820543 0.3920244 0.3381478 0.3012412 0.2738966 0.2525667
 [8] 0.2353113 0.2209680 0.2087918
Warning message:
In 1:steps : numerical expression has 10 elements: only the first used

实际上,这是不正确的,因为该功能仅适用于d的第一个主管,即2 = d * 250。 问题在于步骤,因为它会更改并从数据帧的行中获取值。 正确的方法之一是:

    > mapply(function(c,d,e) f(x=0.5,para,c,d,e),c=Data$c,d=Data$d,e=Data$e)
 [1] 6.844600e-01 1.761008e-01 5.190021e-02 1.609455e-02 5.113622e-03
 [6] 1.645010e-03 3.185962e-04 1.031473e-04 3.339030e-05 1.078962e-05

我想找到的是一种简单方法和直接方法,仅使用f而不使用mapply。

提前致谢。

我想您知道问题出在哪里。 稍微修改您的函数以使其可以使用矢量参数:

f1<-function(x,para,c,d,e){
    #  Constant
    h=0.25
    #para_para<-c() set up the parameters of the model 
    y1=para[1]
    y2=para[2]
    y3=para[3]

    # Recursion back to time t
    f <- rep(NA, length(c))
    for (i in 1:length(c)){
        A=0
        B=0
        steps<-round(d[i]*250,0)
        for (j in 1:steps){
            A= A+ e[i]*x +y1*B
            B= y2*B+y3 
        }
        f[i] = exp(log(c[i])*x -A + B*h )        
    }
    return(f)
}

现在,它可以同时使用标量和向量参数。

f1(x=0.5,para,c=0.1,d=0.2,e=0.3)
#[1] 4.647528e-15
f1(x=0.5, para, c=Data$c, d=Data$d, e=Data$e)
#[1] 6.844600e-01 1.761008e-01 5.190021e-02 1.609455e-02 5.113622e-03 1.645010e-03 3.185962e-04 1.031473e-04 3.339030e-05
#[10] 1.078962e-05

这会给您您想要的吗?

在内部使用lambda函数apply

> apply(Data, 1, function (p) f(x=0.5, para, p['c'], p['d'], p['e']))
           1            2            3            4            5            6            7            8 
6.844600e-01 1.761008e-01 5.190021e-02 1.609455e-02 5.113622e-03 1.645010e-03 3.185962e-04 1.031473e-04 
           9           10 
3.339030e-05 1.078962e-05 

您还可以重写函数,以便与apply一起更紧凑地工作:

f2<-function(cde, x, para){
  c <- cde[1]
  d <- cde[2]
  e <- cde[3]
  #  Constant
  h=0.25

  #para_para<-c() set up the parameters of the model 
  y1=para[1]
  y2=para[2]
  y3=para[3]

  # Terminal condition for the A and B at time T
  A=0
  B=0
  # Recursion back to time t
  steps<-round(d*250,0) 

  for (i in 1:steps){
    A= A+ e*x +y1*B
    B= y2*B+y3 
  }

  f = exp(log(c)*x -A + B*h )
  return(f)
}

> apply(Data[,c('c','d','e')], 1, f2, x=0.5, para)
           1            2            3            4            5            6            7            8 
6.844600e-01 1.761008e-01 5.190021e-02 1.609455e-02 5.113622e-03 1.645010e-03 3.185962e-04 1.031473e-04 
           9           10 
3.339030e-05 1.078962e-05 

> all.equal(apply(Data[,c('c','d','e')], 1, f2, x=0.5, para), 
            apply(Data, 1, function (p) f(x=0.5, para, p['c'], p['d'], p['e'])))
[1] TRUE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM