R 计算每个子组最小年数和最大年数之间的变化率

R 计算每个子组最小年数和最大年数之间的变化率,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-

我对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
Name      Length_in_years   Corg_rate
Bois 17   13                0.9%
8-Toume   15                -1.3%
etc.
正如您所看到的,有时每个名称有两到三行结果(理论上,每个名称甚至可以有4、5或更多行)

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

更具体地说,我想做:

(Corg_of_highest_year/Corg_of_lowest_year)^(1/(lowest_year-highest_year))-1
您能否解释一下,您将如何获得一个如下所示的汇总数据集:

   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
Name      Length_in_years   Corg_rate
Bois 17   13                0.9%
8-Toume   15                -1.3%
etc.

使用
dplyr
按(名称)分组,然后计算您的值。这里有一个例子

库(dplyr)
数据%>%
分组单位(名称)%>%
总结(长度=最大(年)-最小(年),公司结束=总额(公司[年==最大(年),公司开始=总额(公司[年==最小(年)])

这将显示分组逻辑,即按(名称)
max(年份)分组后
将给出每个名称的最高年份,而不是总年份。使用此逻辑计算变化率应该很容易,但我不会试图尝试缺少可复制的数据。

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

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 
库(dplyr)
df%>%
分组单位(名称)%>%
总结(长度=差异(范围(年)),
公司费率=((公司[哪一年最高])/公司[哪一年最低])^
(1/长度)-1*100)
#一个tibble:5x3
#名称长度重量率
#                
#1 7-Richeline2 15 0.582
#2 8-15-1.29
#3 Bois17 13 0.859
#4科坎德斯14 1.52
#5.16.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%>%
分组单位(名称)%>%

总结(长度=最大(年)-最大(年[年),首先在组名中创建一个年何时为最大和最小的指标,然后将Corg列扩展到max_Corg(最大年的Corg)和min_Corg,我们可以稍后轻松地计算变化率

my_df %>% 
  group_by(Name) %>%
  mutate( #new column denoting the max and min
    year_max_min = ifelse(Year == max(Year), "MAX_corg",
                          ifelse(Year == min(Year), "MIN_corg",
                                 NA
                                 ) 
                          ) 
  ) %>% 
  filter(!(is.na(year_max_min))) %>% # removing NA
  group_by(Name,  year_max_min) %>%  #grouping by Name and max_min indicator
  summarise(Corg= Corg) %>% #summarising
  spread(year_max_min, Corg) %>% #spread the indicator into two column; MAX_corg and MIN_corg
  mutate(
    rate_of_change = (MAX_corg / MIN_corg)^(1/(MIN_corg - MAX_corg)) - 1 # calculates rate of change
    )


下面是一个使用data.table的解决方案:

df = data.table(df)

mat = df[, .(
   Rate = 100*((Corg[which.max(Year)] / Corg[which.min(Year)])^(1/diff(range(Year))) - 1)
), by = Name]

> mat
           Name       Rate
1:       Bois17  0.8592524
2:      8-Toume -1.2860324
3: 7-Richelien2  0.5817615
4:    Communaux  3.4261123
5:     Cocandes  1.5207989

非常感谢Ronak!出于好奇,如果我想计算最新分析(Corg[which.max(Year))之间的变化率第一次分析与最近的分析相差5年或以上,你会怎么做?它也会改变你公式中的长度,但会改变很多公式吗?@Xav64试试这个
df%>%group_by(Name)%%>%summary(Length=diff(range(Year)),Corg_rate=((Corg[which.max(Year)]/Corg[which.max(Year)(非常感谢Ronak!在我的例子中,应该是(Corg[which.max(Year)]/Corg[which.MIN(Year@Xav64是的,我想你需要
which.max
尽管如此。所以类似于
Length=max(Year)-Year[which.max]的东西(YearIt给出的结果与没有任何条件的结果完全相同。我只是想确定一下,我正在试图得到上一次分析(最近一年)与最接近我的分析的变化率,但至少有5年的差异