【问题标题】:Percentage change in values in rr 中值的百分比变化
【发布时间】:2020-04-12 09:12:41
【问题描述】:

这是我正在使用的 df:

              Date Country      City Specie count min max median variance
27  2020-03-25      IN     Delhi   pm25   797   6 192     92 12116.60
159 2020-03-25      IN   Chennai   pm25    96  27  89     57  1928.38
223 2020-03-25      IN    Mumbai   pm25   285  12 163     90  6275.41
412 2020-03-25      IN Bengaluru   pm25   179  25 145     73  4890.82
419 2020-03-25      IN   Kolkata   pm25   260   6 168    129 10637.10
10  2020-04-10      IN     Delhi   pm25   835   2 393    137 24542.30
132 2020-04-10      IN   Chennai   pm25    87   5 642     53 87856.50
298 2020-04-10      IN    Mumbai   pm25   168   1 125     90  5025.35
358 2020-04-10      IN Bengaluru   pm25   159  21 834     56 57091.10
444 2020-04-10      IN   Kolkata   pm25   219   4 109     64  2176.61

我想计算数据框的“中值”值之间的百分比变化。为此,我使用了以下代码:

    pct_change_pm25 <- day %>%
  arrange(City, .by_group = TRUE) %>%
  mutate(pct_change = -diff(median) / median[-1] * 100)

但我收到此错误:

Error in arrange_impl(.data, dots) : 
  incorrect size (1) at position 2, expecting : 10

mutate 正在创建的行数为 9,并且与 df 中的行数不匹配。 我在stackoverflow上关注了这篇文章: Calculate Percentage Change in R using dplyr

但是,不幸的是 id 对我不起作用。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    由于diff 返回长度小于原始向量1 的向量,因此在计算开始时附加NA。也可能您想分别为每个City 执行此操作,因此按城市分组。

    library(dplyr)
    
    df %>%
      arrange(City) %>%
      group_by(City) %>%
      mutate(pct_change = c(NA, -diff(median) / median[-1] * 100))
    

    进行相同计算的另一种方法是使用lag

    df %>%
      arrange(City) %>%
      group_by(City) %>%
      mutate(pct_change = (lag(median) - median)/median * 100)
    
    
    #  Date       Country City      Specie count   min   max median variance pct_change
    #   <fct>      <fct>   <fct>     <fct>  <int> <int> <int>  <int>    <dbl>      <dbl>
    # 1 2020-03-25 IN      Bengaluru pm25     179    25   145     73    4891.      NA   
    # 2 2020-04-10 IN      Bengaluru pm25     159    21   834     56   57091.      30.4 
    # 3 2020-03-25 IN      Chennai   pm25      96    27    89     57    1928.      NA   
    # 4 2020-04-10 IN      Chennai   pm25      87     5   642     53   87856.       7.55
    # 5 2020-03-25 IN      Delhi     pm25     797     6   192     92   12117.      NA   
    # 6 2020-04-10 IN      Delhi     pm25     835     2   393    137   24542.     -32.8 
    # 7 2020-03-25 IN      Kolkata   pm25     260     6   168    129   10637.      NA   
    # 8 2020-04-10 IN      Kolkata   pm25     219     4   109     64    2177.     102.  
    # 9 2020-03-25 IN      Mumbai    pm25     285    12   163     90    6275.      NA   
    #10 2020-04-10 IN      Mumbai    pm25     168     1   125     90    5025.       0   
    

    【讨论】:

      【解决方案2】:

      有了data.table,我们可以做到

      library(data.table)
      setDT(df)[, pct_change := (shift(median) - median)/median * 100, City]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-30
        • 2018-06-20
        • 2013-01-14
        • 1970-01-01
        相关资源
        最近更新 更多