R语言编写逐行代入1:n序列迭代计算函数的问题
问题根源
你传入函数的df$cpnA/df$n/df$par/df$y都是长度为2的多元素向量,但你写的pvcf函数逻辑是为单组参数(单行数据)设计的。R在处理1:(n)这类语法时,如果n是多元素向量,只会取第一个元素计算,因此会弹出numerical expression has X elements: only the first used的警告,最终结果也不符合预期。
解决方案
处理多条独立行数据不需要强制使用for循环,R有更符合语法习惯的迭代方案,推荐两种常用写法:
方案1:用mapply按元素迭代传参
mapply可以将多个向量的对应元素逐个传入自定义函数,无需修改原有函数逻辑:
df<-data.frame(Acct=c("A","B"),par=c(1000,1000),cpnA=c(30,30),n=c(8,8),y=c(0.025,0.025)) pvcf<-function(cpnA,n,par,y){ i <- 1:n cf<-c(rep(cpnA,n-1),par+cpnA) pv<- sum(cf/(1+y)^i) return(pv) } # 按行传入参数,直接得到所有行的计算结果 df$pv <- mapply(pvcf, df$cpnA, df$n, df$par, df$y)
运行后df的pv列就是每个账户对应的现值结果。
方案2:用dplyr的rowwise()按行计算
如果你习惯用tidyverse语法,可以用rowwise()按行分组后调用函数:
library(dplyr) df <- df %>% rowwise() %>% # 按行分组,后续运算每次只处理一行数据 mutate(pv = pvcf(cpnA, n, par, y)) %>% ungroup() # 取消分组,避免后续运算出错
如果你坚持用for循环也可以实现,但是代码冗余度更高,也容易出现循环变量赋值错误,更推荐上述两种写法。
内容的提问来源于stack exchange,提问作者a_js12
相关产品推荐
相关产品推荐

