如何同时在多个 csv 上 运行 一个函数
How to run a function on multiple csv's at the same time
我有一组 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
我创建了以下函数来return每个现金流量文件的年化内部收益率(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 进行计算。
谁能帮帮我?
我们这里有很多事情要解决,但所有事情都可以用类似的工具解决,apply
系列函数。
让我们分步进行:
- 您需要一次读取多个 csv 文件,可以在此处轻松找到答案:
How to import multiple .csv files at once?
从这里我们可以使用@A5C1D2H2I1M1N2O1R2T1 优秀的代码来创建一个包含所有 csvs 的数据帧列表:
temp = list.files(pattern="*.csv")
myfiles = lapply(temp, read.delim)
请注意原文post!
中此函数的条件和注释
- 接下来我们要再次"apply"您在列表中的所有数据帧上定义的函数。所以可以在这里找到解决方案:
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
,结果将是输出列表。
我有一组 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
我创建了以下函数来return每个现金流量文件的年化内部收益率(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 进行计算。
谁能帮帮我?
我们这里有很多事情要解决,但所有事情都可以用类似的工具解决,apply
系列函数。
让我们分步进行:
- 您需要一次读取多个 csv 文件,可以在此处轻松找到答案:
How to import multiple .csv files at once?
从这里我们可以使用@A5C1D2H2I1M1N2O1R2T1 优秀的代码来创建一个包含所有 csvs 的数据帧列表:
temp = list.files(pattern="*.csv")
myfiles = lapply(temp, read.delim)
请注意原文post!
中此函数的条件和注释- 接下来我们要再次"apply"您在列表中的所有数据帧上定义的函数。所以可以在这里找到解决方案:
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
,结果将是输出列表。