基于条件的平均居中

时间:2016-10-26 16:38:39

标签: r

我是R的新手并且有一个小问题。我有很多带时间戳的数据(数据框称为'EURO')多年来我计算了收益和'时间'变量(样本在下面);

Time    Returns   
9       5
10      5
11      8
12      7
13      7
14      2
15      -4
16      6
17      8
9       5
10      7
11      4
12      6
13      1
14      0
15      -4
16      7
17      -4
9       8
10      1
11      1
12      6
13      8
14      8
15      4
16      -6
17      7

我使用以下代码计算每个时间戳的平均回报率;

Timeaverages <- aggregate(Returns~Time,EURO,mean)

由此我得到每个时间戳的平均回报。但是现在我想表示我的数据中心,即减去每个时间戳的平均回报。例如,如果时间9的平均回报是6,那么meancentred返回将是5-6 = -1。对于时间10,平均回报为5,因此meancentred回报将为2等。

Time    Returns   Meancentered
9       5             -1
10      7              2
11      7              3
12      6              0  
13      6              1
14      4              0
15      -3             -2
16      5              3
17      9              5
9       5              -1
10      7              2
11      4              0
12      6              0
13      1              -4
14      0              -4
15      -4             -3
16      7              5
17      -4             -8
9       8              2
10      1              -4
11      1              -3
12      6              0
13      8              3
14      8              4
15      4              5
16      -6             -8
17      7              3

任何帮助非常感谢

1 个答案:

答案 0 :(得分:0)

如果我已正确理解您正在寻找merge()

merge.df <- merge(EURO, Timeaverages, by="Time", suffixes = c(".ind", ".mean"))

#   Time Returns.ind Returns.mean
#1     9           5     6.000000
#2     9           5     6.000000
#3     9           8     6.000000
#4    10           1     4.333333
#5    10           5     4.333333
# etc

现在只需将两个返回列和cbind之间的差异与merge.df区分开来。

diff <- merge.df$Returns.ind - merge.df$Returns.mean
cbind(merge.df, diff)

#   Time Returns.ind Returns.mean       diff
#1     9           5     6.000000 -1.0000000
#2     9           5     6.000000 -1.0000000
#3     9           8     6.000000  2.0000000
#4    10           1     4.333333 -3.3333333
#5    10           5     4.333333  0.6666667
#6    10           7     4.333333  2.6666667
#7    11           1     4.333333 -3.3333333

附录

如果您使用dplyr,您可以通过分组,变异,取消分组和再次变异来在一个链中完成所有操作。

library(dplyr)
EURO %>% group_by(Time) %>% mutate(Returns.ind = mean(Returns)) %>% 
         ungroup() %>% mutate(diff = Returns - Returns.ind)

不需要中间对象。