2016-02-27 74 views
0

條件我必須的數據幀,並returns.df與funds.df相同尺寸子集劃分dataframes:如何基於R中

returns1 <- c(0.1,0.2,0.5,0.9) 
returns2 <- c(0.3,0.4,0.7,0.1) 
returns.df <- data.frame(returns1,returns2) 
returns.df 

funds1 <- c("Fund A","Fund B","","Fund D") 
funds2 <- c("Fund B","Fund C","","Fund A") 
funds.df <- data.frame(funds1, funds2) 
funds.df 

我試圖存儲4子集返回針對每個資金。例如,對於基金的子基金回報會是什麼樣子:

returns.FundA1 <- c(0.1,"","","") 
returns.FundA2 <- c("","","",0.11) 
returns.FundA.df <- data.frame(returns.FundA1, returns.FundA2) 
returns.FundA.df 

基本上我想創建一個新的data.frame,我只是在fund.df其在returns.df收益更換基金名稱分別,但在一個新的數據框架。 通常我會使用簡單的if函數在多張工作表的Excel中執行此操作。但我相信,這可以做得更快在R 我欣賞任何輸入

回答

0

這是個人喜好,但我會重塑我的數據長格式,其中一切都包含在同一個對象。然後子集(或爲每個基金執行操作)很容易。如果你爲每個基金做同樣的事情,爲每個基金創建一個單獨的數據框是不必要的,而且這將是很多工作。

#create ID based on row number/name 
#returns.df$id <- rownames(returns.df) 
#funds.df$id <- rownames(funds.df) 

returns.df$id <- 1:nrow(returns.df) 
funds.df$id <- 1:nrow(funds.df) 

#combine them (based on these IDs) 
return.funds <- merge(returns.df, funds.df, by="id") 

然後,我們將這個組合的'寬'數據集變成長格式。由於我們有兩種截然不同的方法(回報和資金,都有第一個和第二個值),我們使用data.table,因爲它的熔化函數能夠處理多個measure列。我們在融化函數中設置模式和名稱。

#turn to long 
library(data.table) 
return.funds.m <- melt(setDT(return.funds), 
    measure.vars=patterns(c("returns","funds")), 
    value.name=c("return","fund")) 

現在,我們的數據是這樣的:

id variable return fund 
1: 1  1 0.1 Fund A 
2: 2  1 0.2 Fund B 
3: 3  1 0.5  
4: 4  1 0.9 Fund D 
5: 1  2 0.3 Fund B 
6: 2  2 0.4 Fund C 
7: 3  2 0.7  
8: 4  2 0.1 Fund A 
#example: select fund A 

假設我們希望得到兩個時間點,每個基金的平均收益率,我們可以這樣做:

return.funds.m[,mean(returns), by=fund] 

對於如何運行/檢查多個模型,我參考thisthis的答案。

+0

我其實想到了這樣的事情。但是,我的數據集非常龐大,基金名稱可能會發生變化,這就是爲什麼我找到最好的方法來取代基金名稱,並且它們在相同的元素中分別歸還。我也是這麼做的,因爲我想分別用OLS迴歸來檢驗每個基金。 – Oden

+0

對於第一部分,我不確定你的意思。一個基金可以有不同的名字嗎?對於第二部分,這可以在data.table中完成。 – Heroka

+0

我的意思是,我有多個列,例如第2行中的列C中的基金A可以將它的名稱更改爲列D中的基金B第2行。這不會導致問題嗎?我也許應該在這裏告訴目標。所以我想要計算每個基金的算術平均值,隨着時間的推移。然後我的想法是創建每個基金的一個子集,然後使用apply函數。 – Oden