在R中重新表达一个简单的操作作为函数

时间:2014-06-13 04:42:55

标签: r function

我正在尝试使用两个预先存在的变量-x和y来构造一个新变量z。假设为简单起见,只有5个观测值(对应于5个时间段)并且x = c(5,7,9,10,14)和y = c(0,2,1,2,3)。我实际上只使用x中的第一个观测值作为初始值,然后使用x [1]的折旧值(折旧率为每年0.05)和矢量中随时间的每个观测值构建新变量z,年。我构造的变量采用新的5乘1向量z的形式,并且可以使用R中的以下简单命令获得:

z=NULL
for(i in 1:length(x)){n=seq(1,i,by=1)
z[i]=sum(c(0.95^(i-1)*x[1],0.95^(i-n)*y[n]))}

我遇到的问题是我需要将此操作定义为函数。也就是说,我需要创建一个函数f,当任意向量x和y插入函数f(x,y)时,它会吐出向量z。我已经在圈子里呆了好几天了,我想知道是否有人能够提供关于如何继续的建议。提前谢谢。

4 个答案:

答案 0 :(得分:1)

我希望以下内容能为您效劳......

x=c(5,7,9,10,14) 
y=c(0,2,1,2,3)

getZ = function(x,y){
  z = NULL
  for(i in 1:length(x)){
    n=seq(1,i,by=1)
    z[i]=sum(c(0.95^(i-1)*x[1],0.95^(i-n)*y[n]))
  }
  return = z
}

z = getZ(x,y)
z
5.000000  6.750000  7.412500  9.041875 11.589781

答案 1 :(得分:1)

这将允许以r传入.05(或任何其他值)。

ConstructZ <- function(x, y, r){
  n <- length(y)
  d <- 1 - r
  Z <- vector(length = n)
  for(i in seq_along(x)){
    n = seq_len(i)
    Z[i] = sum(c(d^(i-1)*x[1],d^(i-n)*y[n]))
  }
 return(Z)
}

答案 2 :(得分:1)

这是一个很酷的(如果我自己这样说)我的方法来实现它作为infix运算符(因为你称之为操作)。

ff = function (x, y, i) {
       n = seq.int(i)
       sum(c(0.95 ^ (i - 1) * x[[1]],
             0.95 ^ (i - n) * y[n]))
}
`%dep%` = function (x, y) sapply(seq_along(x), ff, x=x, y=y)

x %dep% y
[1]  5.000000  6.750000  7.412500  9.041875 11.589781

答案 3 :(得分:1)

多次执行循环并每次重新计算指数可能效率低下。这是实现计算的另一种方式

getval <- function(x,y,lambda=.95) {
    n <- length(y)
    pp <- lambda^(1:n-1)
    yy <- sapply(1:n, function(i) {
        sum(y * c(pp[i:1], rep.int(0, n-i)))
    })
    pp*x[1] + yy
}

使用@ vrajs5&#39的示例数据进行测试

x=c(5,7,9,10,14) 
y=c(0,2,1,2,3)
getval(x,y)

# [1]  5.000000  6.750000  7.412500  9.041875 11.589781

但在测试较大的数据(例如

)时,其速度似乎要快10倍
set.seed(15)
x <- rpois(200,20)
y <- rpois(200,20)

我不确定您运行此频率或数据大小的频率,因此效率可能不是您的关注点。我想可读性对于维护而言通常更为重要。