簡體   English   中英

如何同時在多個 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

我創建了以下函數來返回每個現金流文件的年化 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計算它。

誰能幫我?

我們在這里有很多事情要解決,但所有事情都可以用類似的工具來解決, apply函數系列。

讓我們分步進行:

  1. 您需要一次讀取多個 csv 文件,可以在此處輕松找到答案:

如何一次導入多個 .csv 文件?

由此我們可以采用@A5C1D2H2I1M1N2O1R2T1 優秀代碼來創建一個包含所有 csvs 的數據幀列表:

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

請注意原帖中對此功能的條件和評論!

  1. 接下來,我們要再次在列表中的所有數據框上“應用”您定義的函數。 所以可以在這里找到解決方案:

R 中多個數據幀的相同功能

使用lapply我們可以接收一個數據框列表(在步驟 1 中定義)並將一個函數應用於列表中的每個數據框,如下所示:

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

請注意,您仍然需要提前定義函數npv而不是irr ,結果將是輸出列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM