计算R中的增长率时出现问题-结果均为0

vqlkdk9b  于 9个月前  发布在  其他
关注(0)|答案(3)|浏览(109)

我有一个df,其中有不同年份的id和一个变量CI,它是一个id-年份特定的指标,范围在0和1之间。
以下是我的数据的示例:

df <- data.frame(
  id = rep(c("002", "004"), each = 6),
  years = rep(c(1920, 1921, 1922, 1923, 1924, 1925), times = 2),
  CI = c(0.3023104860, 0.3184651329, 0.3173958777, 0.2833701369, 0.2858395440, 0.2436667622,
         0.5499678083, 0.5746689830, 0.5820752615, 0.5941080701, 0.6281830146, 0.6198584776)
)

字符串
我想计算每个id的这个指标的增长率。
它应该是相当直接的,但我不能得到正确的结果,也无法找到可能相关的职位的答案。
我尝试的代码是:

df <- df %>%
  group_by(id) %>%
  mutate(indicator_growth = (CI - (lag(CI)/lag(CI)))


问题是变量indicator_growth被添加到df中,但它只包含0个值。
附言:时间序列对于一些id有一些差距(不是所有的id都有所有年份的CI数据),但是我已经试着只对一个有所有年份数据的id进行同样的计算,我仍然只得到0。
你知道为什么会发生这种情况,以及如何获得实际的增长率吗?你是否也可以提供一个解决方案,以考虑时间序列中的差距,如果差距< 3年,我可以获得最近可用年份之间的增长率,如果差距更大,则为NA值?
先谢谢你了。

daupos2t

daupos2t1#

根据你的解释,我认为你正在寻找lead而不是lag-

library(dplyr)

df %>% mutate(indicator_growth = (lead(CI) - CI)/lead(CI), .by = id)

#    id years        CI indicator_growth
#1  002  1920 0.3023105      0.050726580
#2  002  1921 0.3184651     -0.003368838
#3  002  1922 0.3173959     -0.120075253
#4  002  1923 0.2833701      0.008639137
#5  002  1924 0.2858395     -0.173075644
#6  002  1925 0.2436668               NA
#7  004  1920 0.5499678      0.042983309
#8  004  1921 0.5746690      0.012723919
#9  004  1922 0.5820753      0.020253569
#10 004  1923 0.5941081      0.054243658
#11 004  1924 0.6281830     -0.013429738
#12 004  1925 0.6198585               NA

字符串

b1uwtaje

b1uwtaje2#

首先,你的代码是错误的。你还错过了一个关闭括号),我已经纠正:

df <- df %>%
    group_by(id) %>%
    mutate(indicator_growth = (CI - (lag(CI)/lag(CI))))

字符串
您应该将代码更改为(CI - lag(CI)) / lag(CI),而不是(CI - (lag(CI)/lag(CI))),这会计算错误的增长率。
更好的用途:

df <- df %>%
    group_by(id) %>%
    mutate(indicator_growth = (CI - lag(CI)) / lag(CI))


此外,对于第二个要求,一种解决方法是使用ifelse()函数检查时间间隔是否小于3年,并相应地计算增长率。
下面是如何:

df <- df %>%
    arrange(id, years) %>%
    group_by(id) %>%
    mutate(timeGap = years - lag(years),
           indicator_growth = ifelse(timeGap < 3, (CI - lag(CI)) / lag(CI), NA)) %>% select(-timeGap)


看看这是否有帮助……

4ioopgfo

4ioopgfo3#

问题是leadlag在我的环境中被屏蔽了,因此不能正常工作。

df <- df %>%
  group_by(id) %>%
  mutate(indicator_growth = (CI - dplyr::lag(CI)) / dplyr::lag(CI))

字符串
这个代码是正确计算的。
非常感谢大家的帮助!

相关问题