【问题标题】:How to run a function on multiple csv's at the same time如何同时在多个csv上运行一个函数
【发布时间】:2019-12-20 05:52:04
【问题描述】:

我有一组 3 个 csv,它们都保存在以下目录中:

setwd("~/R/CashFlows")

csv 被命名为:

"Cashflows1.csv" "Cashflows2.csv" "Cashflows3.csv"

并且都是类似于下面的形式(下面的例子是“Cashflows1.csv”)

19/10/2003  -13275
19/11/2003  940.49
19/12/2003  884.71
19/01/2004  832.11
19/02/2004  782.49
19/03/2004  735.74
19/04/2004  691.64
19/05/2004  650.09
19/06/2004  610.91
19/07/2004  573.99
19/08/2004  539.2
19/09/2004  506.42
19/10/2004  475.54
19/11/2004  441.05
19/12/2004  413.91
19/01/2005  388.37
19/02/2005  364.31
19/03/2005  341.66
19/04/2005  320.34
19/05/2005  300.28
19/06/2005  281.39
19/07/2005  263.63
19/08/2005  246.91
19/09/2005  231.2
19/10/2005  216.41
19/11/2005  202.51
19/12/2005  189.43
19/01/2006  177.15
19/02/2006  165.6
19/03/2006  154.75
19/04/2006  144.55
19/05/2006  134.98
19/06/2006  125.99
19/07/2006  117.55
19/08/2006  109.62
19/09/2006  102.18

或者向量形式:

dat <- read.csv("cashflows1.csv", skip=1, header=F)$V2
> dat
 [1] -13275.00    940.49    884.71    832.11    782.49    735.74    691.64    650.09    610.91    573.99    539.20
[12]    506.42    475.54    441.05    413.91    388.37    364.31    341.66    320.34    300.28    281.39    263.63
[23]    246.91    231.20    216.41    202.51    189.43    177.15    165.60    154.75    144.55    134.98    125.99
[34]    117.55    109.62    102.18

我创建了以下函数来返回每个现金流文件的年化IRR(示例中使用的是Cashflows1.csv)

 setwd("~/R Studio/Technical Test")
> dat <- read.csv("cashflows1.csv", skip=1, header=F)$V2
> npv<-function(i,cf,t=seq(along=cf)) sum (cf/(1+i)^t)
> irr <- function(cf) {uniroot(npv, c(0,1), cf=cf)$root }
> irr(dat)
[1] 0.002384391
> var <- irr(dat)
> 
> AIRR <- (1+var)^12-1
> AIRR
[1] 0.02899093
> 

我将如何更改函数,以便它同时计算目录中所有 csv 的 IRR,因为我目前必须为“dat”变量规定特定的现金流文件。但希望它为“X”个 csv 计算它。

谁能帮帮我?

【问题讨论】:

  • 请考虑在您的数据中包含small, reproducible version
  • 这有帮助吗?抱歉,我是这个网站和 R 的新手。
  • 是的!很高兴看到您能够从下面的人那里获得帮助。 :)

标签: r csv vector irr xirr


【解决方案1】:

我们有很多事情要在这里解决,但都可以使用类似的工具,apply-family 函数来解决。

让我们一步一步来:

  1. 您需要一次读取多个 csv 文件,可以在此处轻松找到答案:

How to import multiple .csv files at once?

由此我们可以使用 @A5C1D2H2I1M1N2O1R2T1 优秀的代码来创建一个包含所有 csv 的数据帧列表:

temp = list.files(pattern="*.csv")
myfiles = lapply(temp, read.delim)

请注意原帖中此函数的条件和cmets!

  1. 接下来,我们要再次对列表中的所有数据框“应用”您定义的函数。所以可以在这里找到解决方案:

Same function over multiple data frames in R

使用lapply,我们可以获取一个数据框列表(在步骤1中定义)并将一个函数应用于列表中的每个数据框,如下所示:

result <- lapply(myfiles, function(x) {
          uniroot(npv, c(0,1), x=x)$root
})

请注意,您仍然需要提前定义函数npv而不是irr,结果将是输出列表。

【讨论】:

  • 感谢您的帮助!我收到以下错误: f(lower, ...) 中的错误:未使用的参数 (x = x) 有关如何解决此问题的任何建议?
  • myfiles = lapply(temp, read.delim) 有没有办法更改此代码,以便以这种形式显示 csv read.csv("cashflows1.csv", skip=1, header=F)$V2
  • @Ringo145 关于错误尝试根据您的原始函数将 x 替换为 cf 。关于第二个问题, lapply 可以接受任何函数,包括参数,所以 read.csv 应该可以工作。阅读 lapply 文档或在 r 中输入 ?lapply 以获得指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多