我是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函数给出的值。但是,对于多个变量,这似乎不起作用。
有人可以就此问题给我一些指导或建议吗?
谢谢!
答案 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
解决方案需要更少的摆弄。sweep
和apply
方法似乎做得同样以及适当的动物园对象:
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