我正在尝试使用两个预先存在的变量-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。我已经在圈子里呆了好几天了,我想知道是否有人能够提供关于如何继续的建议。提前谢谢。
答案 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)
我不确定您运行此频率或数据大小的频率,因此效率可能不是您的关注点。我想可读性对于维护而言通常更为重要。