我想在R。
中运行以下formula
我的数据框如下所示:
Y N s
1 100 1 1
2 101 0.95 2
3 110 0.9025 3
4 112 0.8573 4
5 114 0.8145 5
6 120 0.7737 6
其中N是公式中的beta ^ s-1,beta = 1-0.05(=折扣因子)。
公式的结果应该在新列中输入我的数据框。这个新列的第一行可以如下计算,其中k = 3
mydata$Ydsc<- crossprod(mydata$N[1:3],mydata$Y[2:4])/sum(mydata$N[1:3])
t = 2的第二个值将来自
mydata$Ydsc<- crossprod(mydata$N[1:3],mydata$Y[3:5])/sum(mydata$N[1:3])
但是,我的问题是在R中的函数中正确地表达它,以便它应用于Y列中的每一行。
我的方法是使用apply函数,但我没有设法在我的函数中包含Y_t + s:
fun <- function(x,y) {
crossprod{x[1:3],y)/sum(x[1:3])
x <- mydata$N
y <- mydata$Y
}
Ydsc<-apply(mydata[,1],1,fun)
我该怎么做?
答案 0 :(得分:2)
也许你想要在最后的Note中可重复定义mydata
的地方。 fun
使用矩阵x
作为输入,其第一列为Y
,第二列为N
。它将Y
的当前行和连续行用于总计k
行,并且N
行的下一行和连续行总共k
行并将N
的那些归一化,乘以和求和。它将它应用于输入的每一行。
library(zoo)
k <- 3
k1 <- k+1
fun <- function(x) sum(prop.table(x[-k1, 2]) * x[-1, 1])
rollapply(mydata, k1, fun, by.column = FALSE, align = "left", fill = NA)
## [1] 107.4777 111.9316 115.1972 NA NA NA
代价略长的代码,为清晰起见,我们可以像这样编写fun
:
fun <- function(x) {
Y <- x[, 1]
N <- x[, 2]
sum(prop.table(N[-k1]) * Y[-1])
}
Lines <- " Y N s
1 100 1 1
2 101 0.95 2
3 110 0.9025 3
4 112 0.8573 4
5 114 0.8145 5
6 120 0.7737 6"
mydata <- read.table(text = Lines)