【问题标题】:Calculate percentage change in dataframe from first row从第一行计算数据框的百分比变化
【发布时间】:2020-06-04 22:46:12
【问题描述】:

我想使用第一行作为参考来计算我的数据框中的百分比变化。例如我的数据框

Set  rate  field
 A     3     10
 B     2     17
 C     5     4

使用 A 行作为参考,我想计算数据框中所有列从 A 行到每隔一行的百分比变化。 这将导致

Set  rate  field      
 A     3     10 
 B    -33    70
 C    66.66  -60

or

Set  rate  field pct_rate   pct-field
 A     3     10     0           0
 B     2     17     -33         70
 C     5     4      66.66       -60

我的代码:

 z %>%
   mutate(pct_rate = (rate - lag(rate)/ rate ) * 100)

这并没有给我想要的结果

【问题讨论】:

    标签: r dataframe


    【解决方案1】:
    df <- fread("Set  rate  field
     A     3     10
     B     2     17
     C     5     4")
    

    使用dplyr 的解决方案:我们可以使用dplyr 的first 函数来引用向量的第一个元素(您尝试使用lag 非常接近此解决方案)。此外,我在分母中使用了first(rate) 来计算百分比差异以获得示例中的数字...

    library(dplyr)
    df %>% 
      mutate(pct_rate = (rate - first(rate)) / first(rate)  * 100,
             pct_field = (field - first(field)) / first(field)  * 100)
    

    返回:

       Set rate field  pct_rate pct_field
    1:   A    3    10   0.00000         0
    2:   B    2    17 -33.33333        70
    3:   C    5     4  66.66667       -60
    

    【讨论】:

    • 与往常一样,tidyverse 解决方案更容易理解。
    【解决方案2】:

    您可以使用z$rate[1]z$field[1] 获取第一个元素并使用所有值进行计算。

    z$pct_rate <- 100 * (z$rate - z$rate[1]) / z$rate[1]
    z$pct_field <- 100 * (z$field - z$field[1]) / z$field[1]
    z
    #  Set rate field  pct_rate pct_field
    #1   A    3    10   0.00000         0
    #2   B    2    17 -33.33333        70
    #3   C    5     4  66.66667       -60
    

    或对于许多列:

    rbind(z[1,], do.call(cbind.data.frame, c(z[1],
     lapply(z[-1], function(x) 100 * (x - x[1]) / x[1])))[-1,])
    #  Set      rate field
    #1   A   3.00000    10
    #2   B -33.33333    70
    #3   C  66.66667   -60
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多