使用dplyr的几何平均值

时间:2018-08-18 14:15:54

标签: r dplyr

我正在尝试使用dplyr计算几何平均值。我正在使用一些股票行情记录和股息支付。我尝试group_by()的每个股票代码并采用2018年的最后一个dividend值(例如F-福特)(0.45000)除以第一个dividend值1990(4.71300)提升为1 /(#ofyear)的幂,然后减去1。

(0.450 / 4.713)^(1/28) - 1(适用于代码为F的福特公司)。

由于头几年的时间因不同公司而异,因此我对第一年和最后几年的编码有些困惑。

数据:

divs_yearly <- structure(list(symbol = c("F", "F", "F", "F", "F", "F", "F", 
"F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", 
"F", "F", "F", "F", "GE", "GE", "GE", "GE", "GE", "GE", "GE", 
"GE", "GE", "GE", "GE", "GE", "GE", "GE", "GE", "GE", "GE", "GE", 
"GE", "GE", "GE", "GE", "GE", "GE", "GE", "GE", "GE", "GE", "GE", 
"MSFT", "MSFT", "MSFT", "MSFT", "MSFT", "MSFT", "MSFT", "MSFT", 
"MSFT", "MSFT", "MSFT", "MSFT", "MSFT", "MSFT", "MSFT", "MSFT"
), year = c(1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2012, 2013, 2014, 
2015, 2016, 2017, 2018, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 
2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 
2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 
2014, 2015, 2016, 2017, 2018), dividends = c(4.713, 3.06345, 
2.5136, 2.5136, 2.09682, 1.22994, 1.59787, 1.64484, 1.71978, 
1.88002, 1.80015, 1.05, 0.4, 0.4, 0.4, 0.4, 0.25, 0.2, 0.4, 0.5, 
0.6, 0.6, 0.6, 0.45, 1.9176, 2.0796, 2.3172, 2.6052, 1.8474, 
1.6896, 1.9008, 1.3404, 1.2501, 1.4604, 0.8435, 0.66, 0.73, 0.77, 
0.82, 0.91, 1.03, 1.15, 1.24, 0.61, 0.46, 0.61, 0.755, 0.79, 
0.89, 0.92, 0.93, 1.2, 0.24, 0.24, 0.16, 0.32, 0.37, 0.41, 0.46, 
0.52, 0.55, 0.68, 0.83, 0.97, 1.15, 1.29, 1.47, 1.59, 1.26), 
    growth = structure(list(symbol = c("F", "F", "F", "F", "F", 
    "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", 
    "F", "F", "F", "F", "F", "F", "F", "GE", "GE", "GE", "GE", 
    "GE", "GE", "GE", "GE", "GE", "GE", "GE", "GE", "GE", "GE", 
    "GE", "GE", "GE", "GE", "GE", "GE", "GE", "GE", "GE", "GE", 
    "GE", "GE", "GE", "GE", "GE", "MSFT", "MSFT", "MSFT", "MSFT", 
    "MSFT", "MSFT", "MSFT", "MSFT", "MSFT", "MSFT", "MSFT", "MSFT", 
    "MSFT", "MSFT", "MSFT", "MSFT"), year = c(1990, 1991, 1992, 
    1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 
    2003, 2004, 2005, 2006, 2012, 2013, 2014, 2015, 2016, 2017, 
    2018, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 
    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 
    2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 
    2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 
    2013, 2014, 2015, 2016, 2017, 2018), dividends = c(NA, -0.35, 
    -0.17948717948718, 0, -0.165809993634628, -0.413426045154091, 
    0.299144673723921, 0.0293953826030904, 0.045560662435252, 
    0.093174708392934, -0.0424835906001001, -0.416715273727189, 
    -0.619047619047619, 0, 0, 0, -0.375, -0.2, 1, 0.25, 0.2, 
    0, 0, -0.25, NA, 0.0844806007509387, 0.114252740911714, 0.124287933713102, 
    -0.290879778903731, -0.085417343293277, 0.125, -0.294823232323232, 
    -0.0673679498657117, 0.16822654187665, -0.422418515475212, 
    -0.217545939537641, 0.106060606060606, 0.0547945205479452, 
    0.0649350649350651, 0.109756097560975, 0.131868131868132, 
    0.116504854368932, 0.0782608695652172, -0.508064516129032, 
    -0.245901639344262, 0.326086956521739, 0.237704918032787, 
    0.0463576158940397, 0.126582278481013, 0.0337078651685394, 
    0.0108695652173914, 0.290322580645161, -0.8, NA, -0.333333333333333, 
    1, 0.15625, 0.108108108108108, 0.121951219512195, 0.130434782608696, 
    0.0576923076923077, 0.236363636363636, 0.220588235294118, 
    0.168674698795181, 0.185567010309278, 0.121739130434783, 
    0.13953488372093, 0.0816326530612246, -0.207547169811321)), .Names = c("symbol", 
    "year", "dividends"), class = c("grouped_df", "tbl_df", "tbl", 
    "data.frame"), row.names = c(NA, -69L), vars = "symbol", labels = structure(list(
        symbol = c("F", "GE", "MSFT")), row.names = c(NA, -3L
    ), class = "data.frame", vars = "symbol", drop = TRUE, .Names = "symbol"), indices = list(
        0:23, 24:52, 53:68), drop = TRUE, group_sizes = c(24L, 
    29L, 16L), biggest_group_size = 29L)), .Names = c("symbol", 
"year", "dividends", "growth"), row.names = c(NA, -69L), vars = "symbol", drop = TRUE, class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"))

1 个答案:

答案 0 :(得分:4)

最后一个功能和第一个功能的组合将带您到达那里。我只使用了data.set的前三列,因为尝试使用您的完整集时出现错误。

divs_yearly %>% 
  group_by(symbol) %>% 
  summarise(gm = (last(dividends) / first(dividends)) ^(1 / (last(year) - first(year))) - 1  )

# A tibble: 3 x 2
  symbol      gm
  <chr>    <dbl>
1 F      -0.0805
2 GE     -0.0715
3 MSFT    0.117 

数据:

divs_yearly <- structure(list(symbol = c("F", "F", "F", "F", "F", "F", "F", 
"F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", 
"F", "F", "F", "F", "GE", "GE", "GE", "GE", "GE", "GE", "GE", 
"GE", "GE", "GE", "GE", "GE", "GE", "GE", "GE", "GE", "GE", "GE", 
"GE", "GE", "GE", "GE", "GE", "GE", "GE", "GE", "GE", "GE", "GE", 
"MSFT", "MSFT", "MSFT", "MSFT", "MSFT", "MSFT", "MSFT", "MSFT", 
"MSFT", "MSFT", "MSFT", "MSFT", "MSFT", "MSFT", "MSFT", "MSFT"
), year = c(1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2012, 2013, 2014, 
2015, 2016, 2017, 2018, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 
2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 
2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 
2014, 2015, 2016, 2017, 2018), dividends = c(4.713, 3.06345, 
2.5136, 2.5136, 2.09682, 1.22994, 1.59787, 1.64484, 1.71978, 
1.88002, 1.80015, 1.05, 0.4, 0.4, 0.4, 0.4, 0.25, 0.2, 0.4, 0.5, 
0.6, 0.6, 0.6, 0.45, 1.9176, 2.0796, 2.3172, 2.6052, 1.8474, 
1.6896, 1.9008, 1.3404, 1.2501, 1.4604, 0.8435, 0.66, 0.73, 0.77, 
0.82, 0.91, 1.03, 1.15, 1.24, 0.61, 0.46, 0.61, 0.755, 0.79, 
0.89, 0.92, 0.93, 1.2, 0.24, 0.24, 0.16, 0.32, 0.37, 0.41, 0.46, 
0.52, 0.55, 0.68, 0.83, 0.97, 1.15, 1.29, 1.47, 1.59, 1.26)), row.names = c(NA, 
-69L), class = c("tbl_df", "tbl", "data.frame"))