【问题标题】:Growth rates, using the last non-NA value by groups增长率,按组使用最后一个非 NA 值
【发布时间】:2017-03-04 16:31:51
【问题描述】:

我有一个如下所示的数据框:

   value id
1      2  A
2      5  A
3     NA  A
4      7  A
5      9  A
6      1  B
7     NA  B
8     NA  B
9      5  B
10     6  B

我想使用 id 变量来计算值的增长率来分组。通常,我会这样做:

df <- df %>% group_by(id) %>% mutate(growth = log(value) - as.numeric(lag(value)))

要获取此数据框:

   value    id     growth
   (dbl) (chr)      (dbl)
1      2     A         NA
2      5     A -0.3905621
3     NA     A         NA
4      7     A         NA
5      9     A -4.8027754
6      1     B         NA
7     NA     B         NA
8     NA     B         NA
9      5     B         NA
10     6     B -3.2082405

现在我想做的是将最后一个非 NA 值也用于增长率。有点像计算“NA-gaps”的增长率。例如:第 4 行应该是从 5 到 7 的增长率,第 9 行应该是从 1 到 5 的增长率。​​p>

谢谢!

【问题讨论】:

  • 可能会在计算增长率之前进行排序?
  • df %&gt;% filter(!is.na(value)) %&gt;% group_by(id) %&gt;% mutate(growth = log(value) - as.numeric(lag(value)))?
  • 不幸的是,这会返回一个没有 NA 值的较小数据集,这会导致问题,因为我正在使用具有很多列的数据集来计算增长率,所以我无法过滤只有一个值。

标签: r


【解决方案1】:

zoo::na.locf 将用最后一个非 NA 值替换 NA,因此这可能对您有用:

df <- df %>% 
group_by(id) %>% 
mutate(
valuenoNA = zoo::na.locf(value),
growth = log(valuenoNA) - as.numeric(lag(valuenoNA)))


1      2      A         NA         2
2      5      A -0.3905621         5
3     NA      A -3.3905621         5
4      7      A -3.0540899         7
5      9      A -4.8027754         9
6      1      B         NA         1
7     NA      B -1.0000000         1
8     NA      B -1.0000000         1
9      5      B  0.6094379         5
10     6      B -3.2082405         6

【讨论】:

    【解决方案2】:

    我们可以从tidyverse使用fill

    library(tidyverse)
    df %>%
        group_by(id) %>%
        fill(value) %>%
        mutate(growth = log(value) - lag(value))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 2022-01-03
      • 1970-01-01
      • 2021-08-03
      • 2015-01-28
      • 2015-09-12
      相关资源
      最近更新 更多