Not*_*tna 2 r percentage dataframe
我有一个数据框,从中创建了一个可重现的示例:
\n\ncountry <- c('A','A','A','B','B','C','C','C','C')\nyear <- c(2010,2011,2015,2008,2009,2008,2009,2011,2015)\nscore <- c(1,2,2,1,4,1,1,3,2)\n\n country year score\n1 A 2010 1\n2 A 2011 2\n3 A 2015 2\n4 B 2008 1\n5 B 2009 4\n6 C 2008 1\n7 C 2009 1\n8 C 2011 3\n9 C 2015 2\nRun Code Online (Sandbox Code Playgroud)\n\n我试图通过计算每年的 [(最终分数 - 初始分数) \xc3\xb7 (初始分数)] 并在几年内对其进行平均来计算每个国家/地区分数的平均增加(或减少)百分比。
\n\n country year score change\n1 A 2010 1 NA\n2 A 2011 2 1\n3 A 2015 2 0\n4 B 2008 1 NA\n5 B 2009 4 3\n6 C 2008 1 NA\n7 C 2009 1 0\n8 C 2011 3 2\n9 C 2015 2 -0.33\nRun Code Online (Sandbox Code Playgroud)\n\n我希望获得的最终结果:
\n\n country avg_change\n1 A 0.5\n2 B 3\n3 C 0.55\nRun Code Online (Sandbox Code Playgroud)\n\n正如您所看到的,诀窍在于国家/地区跨越不同的年份,有时中间会缺少年份。我尝试了不同的方法来手动完成,但我确实很挣扎。如果有人能提示我一个解决方案那就太好了。非常感谢。
\n有了dplyr,我们就可以group_by country得到 和mean之间的区别了scores。
library(dplyr)
df %>%
group_by(country) %>%
summarise(avg_change = mean(c(NA, diff(score)), na.rm = TRUE))
# country avg_change
# <fct> <dbl>
#1 A 0.500
#2 B 3.00
#3 C 0.333
Run Code Online (Sandbox Code Playgroud)
使用基本 Raggregate具有相同的逻辑
aggregate(score~country, df, function(x) mean(c(NA, diff(x)), na.rm = TRUE))
Run Code Online (Sandbox Code Playgroud)