我有一个如下所示的数据框:
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的增长率。 p>
谢谢!
答案 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))