2012-09-25 52 views
17

說我得在一列價格和年data.frame在另一:通貨膨脹調整價格套餐?

prices <- rnorm(200, mean=10, sd=3) 
years <- round(rnorm(200, mean=2006, sd=5)) 
df <- data.frame(prices, years) 

現在說我想用居民消費價格指數正常化所有這些價格到2008美元。我可以去查看轉換值並手動進行計算,但我的直覺告訴我可能有一個包可以自動執行此操作。對r-seek和cran的搜索沒有產生任何明顯的結果。

有人知道任何事嗎?

+3

您可以使用'quantmod'中的'getSymbols'從FRED下載CPI數據。我不確定你想要什麼,但你可以看看[這裏](http://research.stlouisfed.org/fred2/tags/series/?t=cpi)。例如'getSymbols(「CPIAUCSL」,src ='FRED')'將下載所有城市消費者的**消費者價格指數:所有物品** – GSee

+1

@請參閱評論而不是回答?這似乎很完整。 – Gregor

回答

20

可以使用getSymbols功能的 FRED方法在 quantmod

getSymbols("CPIAUCSL", src='FRED') #Consumer Price Index for All Urban Consumers: All Items 
#[1] "CPIAUCSL" 
tail(CPIAUCSL) 
#   CPIAUCSL 
#2012-03-01 229.098 
#2012-04-01 229.177 
#2012-05-01 228.527 
#2012-06-01 228.618 
#2012-07-01 228.723 
#2012-08-01 230.102 

# make an `xts` object of prices 
set.seed(1) 
p <- xts(rnorm(63, mean=10, sd=3), seq(from=as.Date('1950-12-01'), by='years', length.out=63)) 
colnames(p) <- "price" 

CPI inflation calculator at the BLS

FRED得到CPI數據......使用的平均消費物價指數給定日曆年... 對於當前年份,使用最新的每月指數值。

(對於這個答案,我會忽略above quote的第二部分...)

所以,計算平均每年

avg.cpi <- apply.yearly(CPIAUCSL, mean) 

然後通過把所有指數水平基價創建一個換算係數

cf <- avg.cpi/as.numeric(avg.cpi['2008']) #using 2008 as the base year 
dat <- merge(p, cf, all=FALSE) 
dat$adj <- dat[, 1] * dat[, 2] 

tail(dat) 
#    price CPIAUCSL  adj 
#2006-12-01 8.898336 0.9363693 8.332128 
#2007-12-01 6.867596 0.9632483 6.615200 
#2008-12-01 11.709159 1.0000000 11.709159 
#2009-12-01 9.594836 0.9967933 9.564069 
#2010-12-01 17.204853 1.0131453 17.431015 
#2011-12-01 9.882280 1.0449769 10.326754 
+0

很好地完成。走出去並手動提取CPI正是我試圖更聰明地做的事情。 – Peter

+3

@Peter,你會愛上[quantmod](http://www.quantmod.com)。你也可能喜歡[qmao](https://r-forge.r-project.org/R/?group_id=1113) – GSee

+0

我可能會完全瘋狂,但是你不想用換算係數來劃分? 2006年美元在2008年價值更高,而2011年美元應該更值得嗎? –

6

沒有爲取得全年CPI更簡單的解決方案(例如, 。,CPIAUCSL),不需要使用quantmod軟件包,至少在我的經驗中,這種軟件包似乎總是因爲某種原因存在兼容性問題。

require(lubridate) || install.packages("lubridate") 
require(dplyr) || install.packages("dplyr") 
monthly_cpi <- 
    read.table("http://research.stlouisfed.org/fred2/data/CPIAUCSL.txt", 
      skip = 53, header = TRUE) 
monthly_cpi$cpi_year <- year(monthly_cpi$DATE) 
yearly_cpi <- monthly_cpi %.% group_by(cpi_year) %.% summarize(cpi = mean(VALUE)) 

然後,創建你的調整係數相對地說,去年的價格:

yearly_cpi$adj_factor <- yearly_cpi$cpi/yearly_cpi$cpi[yearly_cpi$cpi_year == 2013] 

你必須看看有多少行skip,但話又說回來,使你真正看在通過查看實際數據源而跳過的行處,這恰好具有有用的前導碼信息。

但是等待!還有更多!

感謝@GSee(誰給了選中的答案)注意到有一個.csv版本,您不必跳過任何行!使用此版本,代碼如下:

require(lubridate) || install.packages("lubridate") 
require(dplyr) || install.packages("dplyr") 
monthly_cpi <- 
    read.csv("http://research.stlouisfed.org/fred2/data/CPIAUCSL.csv", header = TRUE) 
monthly_cpi$cpi_year <- year(monthly_cpi$DATE) 
yearly_cpi <- monthly_cpi %.% group_by(cpi_year) %.% summarize(cpi = mean(VALUE)) 
yearly_cpi$adj_factor <- yearly_cpi$cpi/yearly_cpi$cpi[yearly_cpi$cpi_year == 2013] 
+1

您知道有一個CSV版本嗎? http://research.stlouisfed.org/fred2/data/CPIAUCSL.csv – GSee

+0

哦,快照,比利! –