价格索引时间序列数据

时间:2016-11-14 01:49:33

标签: r indexing

我是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

从这个原始数据集中,我想创建一个包含(当前值/第一个值)* 100 =索引值的数据集,例如EXJPUS:(208.7918 / 202.3667)* 100 = 103.175 < / p>

如果我可以对所有三个变量实施此计算,我希望得到一个类似于此的结果表;

               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函数给出的值。但是,对于多个变量,这似乎不起作用。

有人可以就此问题给我一些指导或建议吗?

谢谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

假设这是一个xts或zoo对象,可以使用sweep运算符将所有行除以第一行(然后乘以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

答案 2 :(得分:-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