如何将 pv.uneven(FinCal 库)(或任何以向量作为输入的函数)应用于数据框的每一行?
How to apply pv.uneven (FinCal library) (or any function with vectors as input) to every row of a data frame?
我正在尝试对数据框的每一行执行一个现值,这应该不会太难,但在每一行中它必须使用特定范围的列。我有这个:
int<-sample(0:3,1000,rep=TRUE)/100
period<-sample(1:9,1000,rep=TRUE)
a<-data.frame(replicate(10,sample(0:10,1000,rep=TRUE)),int,period)
假设第 1:10 列是付款,然后是 PV 的利率,最后一列(句点)表示从哪一列开始该特定行的 PV。我正在使用 for
来完成此操作,但我想知道是否有更简单的方法,因为我是在超过 100 万行的数据帧上执行此操作的:
a$vpn<-0
for (i in 1:nrow(a))
{
a$vpn[i]<-pv.uneven(a$int[i],a[i,a$period[i]:10])
}
如有任何帮助,我们将不胜感激。
谢谢
我们不知道 pv.uneven
是什么,但假设我们有
pv<-function(interest,cfs) sum(cfs*(1+interest)^-seq_along(cfs))
因此对于数据框 a
的给定行 i
,您需要 pv(a$int[i],a[i,a$period[i]:10])
.
一个有用的技巧是创建一个辅助函数
pv.aux<-function(int,period,end=10,...) pv(int,c(...)[period:end])
这样你就可以 do.call
一个 mapply
a$vpn<-do.call(mapply,c(pv.aux,a))
对我来说,这比您当前的循环解决方案快很多倍。
我正在尝试对数据框的每一行执行一个现值,这应该不会太难,但在每一行中它必须使用特定范围的列。我有这个:
int<-sample(0:3,1000,rep=TRUE)/100
period<-sample(1:9,1000,rep=TRUE)
a<-data.frame(replicate(10,sample(0:10,1000,rep=TRUE)),int,period)
假设第 1:10 列是付款,然后是 PV 的利率,最后一列(句点)表示从哪一列开始该特定行的 PV。我正在使用 for
来完成此操作,但我想知道是否有更简单的方法,因为我是在超过 100 万行的数据帧上执行此操作的:
a$vpn<-0
for (i in 1:nrow(a))
{
a$vpn[i]<-pv.uneven(a$int[i],a[i,a$period[i]:10])
}
如有任何帮助,我们将不胜感激。
谢谢
我们不知道 pv.uneven
是什么,但假设我们有
pv<-function(interest,cfs) sum(cfs*(1+interest)^-seq_along(cfs))
因此对于数据框 a
的给定行 i
,您需要 pv(a$int[i],a[i,a$period[i]:10])
.
一个有用的技巧是创建一个辅助函数
pv.aux<-function(int,period,end=10,...) pv(int,c(...)[period:end])
这样你就可以 do.call
一个 mapply
a$vpn<-do.call(mapply,c(pv.aux,a))
对我来说,这比您当前的循环解决方案快很多倍。