2014-11-17 175 views
0

我有一个变量Ar功能

0 
10 
15 
20 
25 
30 
35 
40 
45 
50 
55 
60 
65 
70 
75 
80 
85 
90 

其是输入到下面的函数

NoBeta <- function(A) 
     { 
      return(1-(1- B * (1-4000))/EXP(0.007*A) 
    } 

的变量B是这个函数的结果如何做我将结果反馈给函数来计算我的下一个结果? 这里是乙

0 
0.07 
0.10 
0.13 
0.16 
0.19 
0.22 
0.24 
0.27 
0.30 
0.32 
0.34 
0.37 
0.39 
0.41 
0.43 
0.45 
0.47 

所以函数需要返回B的值,而且还采用B例如如果我们使用A 10作为输入,那么B的输入为0,当A的输入为15时,B的输入为上次计算的结果0.07

B用Excel中的以下公式计算得出 = 1 - (1-B1 *(1-4000))/ EXP(0.007 * $ A2) 如何在R中实现此公式?

+1

这是不清楚。你究竟在做什么?如果你的公式是迭代的,你可以使用一个循环并在函数结束时返回计算的最终值。 – jonsca

+2

请在您的问题中添加[可重现的示例](http://stackoverflow.com/a/5963610/1412059),即提供一些输入数据并显示相应的预期输出。 – Roland

+0

我想你需要使用外部数据结构(向量?)来存储起始值和迭代结果。如果这需要是单个函数,那么您需要在存储函数(处理数据的函数)中定义估计函数(迭代函数)。 –

回答

1

如果我正确理解你的问题,你希望引用当前行的计算中的前一行。

您可以修改在另一个SO问题here中提供的功能。

rowShift <- function(x, shiftLen = 1L) { 
    r <- (1L + shiftLen):(length(x) + shiftLen) 
    r[r<1] <- NA 
    return(x[r]) 
} 

test <- data.frame(x = c(1:10), y = c(2:11)) 

test$z <- rowShift(test$x, -1) + rowShift(test$y, -1) 
> test 
    x y z 
1 1 2 NA 
2 2 3 3 
3 3 4 5 
4 4 5 7 
5 5 6 9 
6 6 7 11 
7 7 8 13 
8 8 9 15 
9 9 10 17 
10 10 11 19 

然后你想达到什么变得

test$z2 <- 1- (1-rowShift(test$x, -1)*(1-4000))/exp(0.007*rowShift(test$y, -1)) 
> head(test) 
    x y z   z2 
1 1 2 NA   NA 
2 2 3 3 -3943.390 
3 3 4 5 -7831.772 
4 4 5 7 -11665.716 
5 5 6 9 -15445.790 
6 6 7 11 -19172.560 
+0

感谢这个答案,但是只有一个向量/变量A,我有B的数据需要根据A当前观察和B先前观察计算。初始化B将从0开始,但是结果需要反馈到函数中。 – Makoto

+0

对不起,滞后变量不会工作,因为它基本上是我试图在R = 1-(1-B1 *(1-4000))/ EXP(0.007 * $ A2)中实现以下Excel公式, – Makoto