【问题标题】:Calculating Rate of Change计算变化率
【发布时间】:2018-01-31 02:40:43
【问题描述】:

我有一个名为“yield”的数据集:

yield <- data.frame(fruits = c("apples", "apples", "apples", "oranges", "oranges", 
         "oranges", "pears", "pears", "pears"), year = rep(2008:2010, 3), 
         count = c(10, 13, 7, 5, 12, 14, 16, 18, 20))

我想确定 2008 年到 2010 年之间变化率最大的水果。我得到的最接近的是:

diff(yield$count)/yield[-nrow(yield),] * 100

但它不仅影响我的fruitsyear 列,结果也不正确。

【问题讨论】:

  • 请将数据发布为纯文本而非图像,以便用户轻松复制/粘贴。
  • 变化率的公式是什么?
  • (本年数-上年数)/上年数*100
  • 您的公式是正确的当且仅当您还按水果分组。
  • 谢谢,我考虑过使用 dplyr 函数 group_by 但不知道如何使其工作

标签: r statistics


【解决方案1】:

根据您的公式,我认为这个dplyr 解决方案有效。您需要按水果分组,然后按年份订购,lag 才能正常工作:

library(dplyr)
yield %>% 
  group_by(fruits) %>% 
  arrange(fruits, year) %>% 
  mutate(rate = 100 * (count - lag(count))/lag(count)) %>%
  ungroup()

# A tibble: 9 x 4
  fruits   year count   rate
  <fct>   <int> <dbl>  <dbl>
1 apples   2008 10.0    NA  
2 apples   2009 13.0    30.0
3 apples   2010  7.00 - 46.2
4 oranges  2008  5.00   NA  
5 oranges  2009 12.0   140  
6 oranges  2010 14.0    16.7
7 pears    2008 16.0    NA  
8 pears    2009 18.0    12.5
9 pears    2010 20.0    11.1

【讨论】:

  • 非常感谢您。只是几个简单的问题,group_by 让 R 知道纯粹基于 fruits 变量进行分析(mutate 函数),而 lag 函数告诉 R 从每个唯一变量的第二行开始?
  • group_by 确保任何操作都基于“每个水果”。 lag 仅表示“当前行之前的行”。所以count - lag(count) 的意思是“对于count 列的每一行,计算值-前一行值”。每个组的第一个条目是NA,因为第一行没有前一行。
  • 我应该澄清一下,虽然 lag 的默认值是前 1 行,但您也可以指定前 2、3...n 行。
  • 如果这让任何寻找类似解决方案的人感到困惑:虽然滞后是基础(统计数据),但这里需要的是这里使用的 dplyr 版本。
【解决方案2】:

为了完整起见,这里与data.table one-liner 相同。

一、数据

R> library(data.table)
R> df <- data.frame(fruits=rep(c("apples", "oranges", "pears"), each=3), 
+                   year=rep(2008:2010, 3), 
+                   count=c(10,13,7,5,12,14,16,18,20))
R> dt <- as.data.table(df)
R> dt
    fruits year count
1:  apples 2008    10
2:  apples 2009    13
3:  apples 2010     7
4: oranges 2008     5
5: oranges 2009    12
6: oranges 2010    14
7:   pears 2008    16
8:   pears 2009    18
9:   pears 2010    20
R>

二、一行

R> dt[ , .(year, change=100*(count-shift(count,1))/shift(count,1)), by=fruits]
    fruits year   change
1:  apples 2008       NA
2:  apples 2009  30.0000
3:  apples 2010 -46.1538
4: oranges 2008       NA
5: oranges 2009 140.0000
6: oranges 2010  16.6667
7:   pears 2008       NA
8:   pears 2009  12.5000
9:   pears 2010  11.1111
R> 

我们将by=fruits 分组,并在每个块中显示year 和所需的变化率100*(current-prev)/prev,我们使用shift() 来滞后 count 系列。

【讨论】:

  • 谢谢,那我得先把数据框转成数据表?
  • 见我第一段的第 3 行:dt &lt;- as.data.table(df)setDT() 是另一种选择。
【解决方案3】:

基础R一班轮:

yield$roc <- with(yield, ave(count, fruits, FUN = function(x){c(0, c(diff(x), 0)/x)[seq_along(x)]}))

如果您希望 NA 代替 0 和实际百分比(即 *100),则以 R 为基础:

yield$roc <- with(yield, ave(count, fruits, 
              FUN = function(x){c(NA_real_, c(diff(x), 0)/x)[seq_along(x)] * 100}))

基础R函数:

roc <- function(ordered_num_vec){
  c(0, c(diff(ordered_num_vec), 0) / ordered_num_vec)[seq_along(ordered_num_vec)]
}

with(yield, ave(count, fruits, FUN = roc))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    相关资源
    最近更新 更多