2016-11-18 28 views
0

我總回報與股票價格每天都在爲一些銀行的數據,1997年至2015年,這樣的:轉換每天總回報和價格,年度值R中

DATE   Bank1_TotalReturn Bank1_Price Bank2_TR Bank2_P ... and so on for all other banks 
01/01/1997   103.13   10.43  NA  NA 
02/01/1997   104.66   11.12 153.89 23.08 
03/01/1997   ...    ...  ...  ... 
...and so on 
for all other 
days until 
31/12/2015 

使用R,我需要將它們轉換爲「中等年度價值」,這樣我才能爲每個銀行獲得單個年度中等價值的總回報和價格,以便製作面板數據集。

nb:數據包含很多缺失值,代碼必須考慮該問題! :)

+0

可以檢查'quantmod'包。 –

回答

0

您可以使用formatDATE(一旦轉換爲Date類)中提取年份,以將日期轉換爲日期的年份。然後使用dplyr

library(dplyr) 
res <- df %>% group_by(Year=format(as.Date(DATE,format="%d/%m/%Y"),"%Y")) %>% 
       summarise_at(vars(-DATE), median, na.rm=TRUE) 

我們首先group_by的轉換Year,然後我們使用summarise_at來概括median爲每列除DATE。請注意,我們將參數na.rm=TRUE傳遞到median忽略NA's。

或者使用aggregate

df$Year <- format(as.Date(df$DATE,format="%d/%m/%Y"),"%Y") 
df <- df[,!(names(df)=="DATE")] 
res <- aggregate(. ~ Year, data=df, FUN=median, na.rm=TRUE, na.action=NULL) 

在這裏,我們進行預處理dfDATE欄更改爲Year,我們用公式. ~ Year指定由聚集分組Year所有列。請注意,在aggregate中,我們指定na.action=NULL,因爲默認na.action will remove rows that have any不適用. Instead, we pass na.rm = TRUE to the function中位數to handle不適用。

爲了說明問題,我增加你的發佈的數據:使用兩種方法

df <- structure(list(DATE = c("01/01/1997", "02/01/1997", "03/01/1997", 
"04/01/1997", "01/01/1998", "02/01/1998", "03/01/1998", "04/01/1998" 
), Bank1_TotalReturn = c(103.13, 104.66, 105.23, NA, 113.13, 
114.66, 115.23, NA), Bank1_Price = c(10.43, 11.12, 12.15, NA, 
11.43, 12.12, NA, 13.15), Bank2_TR = c(NA, 153.89, 145.89, 136.89, 
140.92, 153.89, 145.89, 146.89), Bank2_P = c(NA, 23.08, NA, NA, 
20.9, 23.08, 25.73, 25.98)), .Names = c("DATE", "Bank1_TotalReturn", 
"Bank1_Price", "Bank2_TR", "Bank2_P"), class = "data.frame", row.names = c(NA, 
-8L)) 
##  DATE Bank1_TotalReturn Bank1_Price Bank2_TR Bank2_P 
##1 01/01/1997   103.13  10.43  NA  NA 
##2 02/01/1997   104.66  11.12 153.89 23.08 
##3 03/01/1997   105.23  12.15 145.89  NA 
##4 04/01/1997    NA   NA 136.89  NA 
##5 01/01/1998   113.13  11.43 140.92 20.90 
##6 02/01/1998   114.66  12.12 153.89 23.08 
##7 03/01/1998   115.23   NA 145.89 25.73 
##8 04/01/1998    NA  13.15 146.89 25.98 

有了這些數據,結果是:

print(res) 
## Year Bank1_TotalReturn Bank1_Price Bank2_TR Bank2_P 
##1 1997   104.66  11.12 145.89 23.080 
##2 1998   114.66  12.12 146.39 24.405 

如果目的是計算平均值,而不是的中位數,那麼只需用mean代替median即可。對於aggregate解決方案:

res <- aggregate(. ~ Year, data=df, FUN=mean, na.rm=TRUE, na.action=NULL) 
print(res) 
## Year Bank1_TotalReturn Bank1_Price Bank2_TR Bank2_P 
##1 1997   104.34 11.23333 145.5567 23.0800 
##2 1998   114.34 12.23333 146.8975 23.9225 
+0

非常感謝你,但我有一個疑問: 你爲什麼使用「中位數」而不是「均值」函數來轉換值? 只是爲了解基本的推理:) – Dan

+0

當你說中等時,我以爲你的意思是「中位數」。你可以在那裏使用'mean'。如果這是你想要的。請看我編輯的答案。 – aichao