R语言 如何计算具有多个站点和不连续年份的数据框中每年的变化率?

hlswsv35  于 2023-06-27  发布在  其他
关注(0)|答案(1)|浏览(111)

我有一个数据库,看起来像下一个例子:
| 站点|年|价值|
| - -----|- -----|- -----|
| site_1|二千年|十个|
| site_1| 2001年|十五|
| site_1|二OO四年|二十三|
| site_1|二零零六年|二十个|
| site_2| 2001年|九个|
| site_2| 2002年|九个|
| site_2|二零零七年|十五|
| site_2|二零零八年|十六|
| site_2| 2010年|十七岁|
我使用下一个函数来计算每个“站点”的“值”的变化率:

rate <- function(x, n=1) {
c(rep(NA, n), diff(x, n))
}

然后我在数据框中创建一个新列,以收集该函数的结果:

df$rate_change <- ave(df$value, factor(df$site), FUN= rate)

然而,我感兴趣的是计算每年的变化率(最终值-初始值/年),而前面的函数没有考虑值之间的年数。例如,“site_1”在2000年和2001年之间的变化率是增加5((15 - 10)/ 1年= 5),而在2001年和2004年之间必须是((23 - 15)/ 3年= 2.66)。
正如你所看到的,我正在使用一个函数,但我知道我可以用不同的方式来做,比如使用循环或dplyr包。
任何想法将非常赞赏。

lx0bsm1f

lx0bsm1f1#

使用dplyr的方法

library(dplyr)

df %>% 
  mutate(rate = c(0, diff(value)) / c(0, diff(year)), .by = site)
    site year value      rate
1 site_1 2000    10       NaN
2 site_1 2001    15  5.000000
3 site_1 2004    23  2.666667
4 site_1 2006    20 -1.500000
5 site_2 2001     9       NaN
6 site_2 2002     9  0.000000
7 site_2 2007    15  1.200000
8 site_2 2008    16  1.000000
9 site_2 2010    17  0.500000
数据
df <- structure(list(site = c("site_1", "site_1", "site_1", "site_1", 
"site_2", "site_2", "site_2", "site_2", "site_2"), year = c(2000L, 
2001L, 2004L, 2006L, 2001L, 2002L, 2007L, 2008L, 2010L), value = c(10L, 
15L, 23L, 20L, 9L, 9L, 15L, 16L, 17L)), class = "data.frame", row.names = c(NA, 
-9L))

相关问题