增长率,按组使用最后一个非NA值

时间:2017-03-04 16:31:51

标签: r

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

   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-gap”的增长率。例如:第4行应该是5到7的增长率,第9行应该是1到5的增长率。

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我们可以使用fill

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