r - 计算每个子组的最短年份和最长年份之间的变化率

标签 r

我对 R 比较陌生,如果问题已经被问到,我很抱歉,但我显然要么无法理解答案,要么无法找到正确的关键词!

这是我的问题:我有一个看起来像这样的数据集:

   Name           Year  Corg
 1 Bois 17        2001   1.7
 2 Bois 17        2007   2.1
 3 Bois 17        2014   1.9
 4 8-Toume        2000   1.7
 5 8-Toume        2015   1.4
 6 7-Richelien 2  2004   1.1
 7 7-Richelien 2  2017   1.5
 8 7-Richelien 2  2019   1.2
 9  Communaux     2003   1.4
 10 Communaux     2016   3.8
 11 Communaux     2019   2.4
 12 Cocandes      2000   1.7
 13 Cocandes      2014   2.1

如您所见,有时每个名称有两行或三行结果(理论上每个名称甚至可以有 4、5 行或更多行)。

对于每个名称,我想计算最高年份和最低年份之间的年度 Corg 变化率。

更具体地说,我想做:

(Corg_of_highest_year/Corg_of_lowest_year)^(1/(lowest_year-highest_year))-1

您能否解释一下如何获得如下所示的汇总数据集:

Name      Length_in_years   Corg_rate
Bois 17   13                0.9%
8-Toume   15                -1.3%
etc.

最佳答案

我们可以使用dplyr中的group_by进行计算

library(dplyr)

df %>%
  group_by(Name) %>%
  summarise(Length = diff(range(Year)), 
        Corg_rate = ((Corg[which.max(Year)]/Corg[which.min(Year)]) ^ 
                      (1/Length) - 1) * 100)

# A tibble: 5 x 3
#  Name         Length Corg_rate
#  <fct>         <int>     <dbl>
#1 7-Richelien2     15     0.582
#2 8-Toume          15    -1.29 
#3 Bois17           13     0.859
#4 Cocandes         14     1.52 
#5 Communaux        16     3.43 

对最近一年和相差至少 5 年的年份进行分析

df %>%
  group_by(Name) %>%  
  summarise(Length = max(Year) - max(Year[Year <= max(Year) - 5]),
            Corg_rate = (Corg[which.max(Year)]/Corg[Year == max(Year[Year <= (max(Year) - 5)])]) ^ (1/Length) - 1, 
            Corg_rate = Corg_rate * 100)



# Name         Length Corg_rate
#  <fct>         <int>     <dbl>
#1 7-Richelien2     15     0.582
#2 8-Toume          15    -1.29 
#3 Bois17            7    -1.42  
#4 Cocandes         14     1.52 
#5 Communaux        16     3.43 

数据

df <- structure(list(Name = structure(c(3L, 3L, 3L, 2L, 2L, 1L, 1L, 
1L, 5L, 5L, 5L, 4L, 4L), .Label = c("7-Richelien2", "8-Toume", 
"Bois17", "Cocandes", "Communaux"), class = "factor"), Year = c(2001L, 
2007L, 2014L, 2000L, 2015L, 2004L, 2017L, 2019L, 2003L, 2016L, 
2019L, 2000L, 2014L), Corg = c(1.7, 2.1, 1.9, 1.7, 1.4, 1.1, 
1.5, 1.2, 1.4, 3.8, 2.4, 1.7, 2.1)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"))

关于r - 计算每个子组的最短年份和最长年份之间的变化率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58011305/

相关文章:

R 计算特定整数序列的实例数

r - R 中跨列的条件变异

r - pandoc 和 knitr 的 ssh 与 Rstudio 服务器中的路径

r - 曲线回归面

r - 在面板数据中创建缺失的观察

r - ggplot2 三角函数图看起来呈锯齿状

r - 如何将 R 中的积分结果分配给数值变量?

R:如何从数据集的组合中执行更复杂的计算?

r - 根据另一列的排名向 R 中的数据框添加一列

r - 如何在 Shiny 的一个下载按钮中下载多个 png 图