2016-11-14 92 views
0

我是R編碼社區的新手,當我學習時遇到了一個我無法解決的問題。我相信這是在大多數人的公園散步,所以我希望有人能找到時間來幫助我。價格索引時間序列數據

我有一套使用R getSymbols函數從FRED下載的貨幣對。然後,我將這些對中的三個組合成一個數據幀(「數據」)

我想要做的是創建這三個變量的索引,以便能夠直接比較它們在一段時間內的性能。例如,這是我的原始數據集;

   EXJPUS EXCHUS EXCAUS 
1981-01-01  202.3667 1.5518 1.1909 

1981-02-01  205.7167 1.6131 1.1984 

1981-03-01  208.7918 1.6314 1.1914 

從這個原始數據集,我想創建包含(電流值/第一值)*的值的數據集,例如與EXJPUS 100 =指標值:(208.7918/202.3667)* 100 = 103.175

如果我可以對所有三個變量實現這個計算,我希望得到一個類似於這樣的結果表;

   EXJPUS EXCHUS EXCAUS 
1981-01-01  100.000 100.000 100.000 

1981-02-01  101.655 103.950 100.630 

1981-03-01  103.175 105.130 100.042 

如果只有一個變量,我能夠使用as.numeric函數提取的第一個值,然後從as.numeric函數給出的值除以所有其他值。但是,對於多個變量,這似乎不起作用。

有人可以給我一些指導或建議在這個問題上?

謝謝!

+1

我假設你想這樣做的R,但你沒有提供一個語言標籤,這是一個猜測。提供適當的語言將極大地幫助人們找到你的問題。 – Evert

+0

'apply(data,2,function(x)x/x [1] * 100)'? – bouncyball

回答

-1
EXJOUS <- c(202.3667, 205.7167, 208.7918) 
EXCHUS <- c(1.5518,1.6131,1.6314) 
EXCAUS <- c(1.1909,1.1984,1.1914) 

z<-data.frame (EXJOUS, EXCHUS, EXCAUS) 
rownames(z) <- c('1981-01-01', '1981-02-01', '1981-03-01') 

x<-z[1,]/z[1,]*100 
for (i in 2:nrow(z)) 
{x<-rbind(x, 
z[i,]/z[1,]*100) 
} 
x 
+0

這很可能是一個動物園/ xts對象。 –

1

有許多方法來執行你的任務,一個是使用apply功能:

apply(data, 2, function(x) x/x[1] * 100) 
      EXJOUS EXCHUS EXCAUS 
1981-01-01 100.0000 100.0000 100.0000 
1981-02-01 101.6554 103.9503 100.6298 
1981-03-01 103.1750 105.1295 100.0420 

我們也可以使用dplyr包,這種方法可以保留基值和索引值:

library(dplyr) 
data %>% mutate_all(funs(pindex = ./.[1])) 

    EXJOUS EXCHUS EXCAUS EXJOUS_pindex EXCHUS_pindex EXCAUS_pindex 
1 202.3667 1.5518 1.1909  100.0000  100.0000  100.0000 
2 205.7167 1.6131 1.1984  101.6554  103.9503  100.6298 
3 208.7918 1.6314 1.1914  103.1750  105.1295  100.0420 
+0

我得到'沒有適用於'tbl_vars'的方法適用於dplyr代碼的「動物園」類的對象。 –

1

假設這是一個XTS或動物園對象時,操作者掃描,可以使用通過在第一行來劃分所有行正是如此(然後MUL tiply 100):

zoo.mat <- 
structure(c(202.3667, 205.7167, 208.7918, 1.5518, 1.6131, 1.6314, 
1.1909, 1.1984, 1.1914), .Dim = c(3L, 3L), .Dimnames = list(c("1981-01-01", 
"1981-02-01", "1981-03-01"), c("EXJPUS", "EXCHUS", "EXCAUS")), index = 1:3, class = "zoo") 

100*sweep(zoo.mat, 2, zoo.mat[1,] , "/") 

    EXJPUS EXCHUS EXCAUS 
1 100.0000 100.0000 100.0000 
2 101.6554 103.9503 100.6298 
3 103.1750 105.1295 100.0420 

我想,如果你想要的行索引的 apply解決方案需要更少的擺弄。 後進一步探索sweepapply方法似乎與一個合適的對象動物園做的同樣出色:

library(zoo) 
zoo.mat <- zoo(cbind(EXJPUS = c(202.3667, 205.7167, 208.7918), EXCHUS = c(1.5518, 1.6131, 1.6314), EXCAUS = c(1.5518, 1.6131, 1.6314)), as.Date(c("1981-01-01", "1981-02-01", "1981-03-01"))) 
100*sweep(zoo.mat, 2, zoo.mat[1,] , "/") 
#----- 
      EXJPUS EXCHUS EXCAUS 
1981-01-01 100.0000 100.0000 100.0000 
1981-02-01 101.6554 103.9503 103.9503 
1981-03-01 103.1750 105.1295 105.1295 
+1

如果'zoo.mat'是動物園系列圖書館(動物園); zoo.mat < - 動物園(cbind(EXJPUS = C(202.3667,205.7167,208.7918), EXCHUS = C(1.5518,1.6131,1.6314), EXCAUS = C(1.5518,1.6131,1.6314)), as.Date (c(「1981-01-01」,「1981-02-01」,「1981-03-01」)))'然後'sweep的輸出(...)'也將是一個具有相同時間索引的動物園系列(與顯示的輸出相反)。 –

+0

我在一個動物園對象上進行了測試,我將添加爲一個編輯,這是(和是)輸出。顯然只有日期類的動物園索引才能以這種方式處理。 –

+0

我開始懷疑我使用的對象是否畸形,因爲無法使用彈跳球建議的方法與我的對象一起工作。 –

相關問題