Мой вопрос относится к следующим (упрощенным) данным панели, для которых я хотел бы создать своего рода xrd_stock
.
#Setup data
library(tidyverse)
firm_id <- c(rep(1, 5), rep(2, 3), rep(3, 4))
firm_name <- c(rep("Cosco", 5), rep("Apple", 3), rep("BP", 4))
fyear <- c(seq(2000, 2004, 1), seq(2003, 2005, 1), seq(2005, 2008, 1))
xrd <- c(49,93,121,84,37,197,36,154,104,116,6,21)
df <- data.frame(firm_id, firm_name, fyear, xrd)
#Define variables
growth = 0.08
depr = 0.15
Для новой переменной с именем xrd_stock
я хотел бы применить следующую механику:
- каждый идентификатор компании должен обрабатываться отдельно:
group_by(firm_id)
- где fyear - минимум, рассчитайте xrd_stock как:
xrd/(growth + depr)
- в противном случае рассчитайте xrd_stock как:
xrd + (1-depr) * [xrd_stock from previous row]
С помощью следующего кода я уже успешно выполнил шаги 1 и 2 и части шага 3.
df2 <- df %>%
ungroup() %>%
group_by(firm_id) %>%
arrange(firm_id, fyear, decreasing = TRUE) %>% #Ensure that data is arranged w/ in asc(fyear) order; not required in this specific example as df is already in correct order
mutate(xrd_stock = ifelse(fyear == min(fyear), xrd/(growth + depr), xrd + (1-depr)*lag(xrd_stock))))
Проблемы возникают в else
части функции, так что R возвращает:
Error: Problem with `mutate()` input `xrd_stock`.
x object 'xrd_stock' not found
i Input `xrd_stock` is `ifelse(...)`.
i The error occured in group 1: firm_id = 1.
Run `rlang::last_error()` to see where the error occurred.
Из этого сообщения об ошибке я понимаю, что R не может ссылаться на только что созданный xrd_stock
в предыдущей строке (логично, если учесть / предположить, что R не работает строго сверху вниз); однако, когда я просто помещаю 9
в часть else
, мой приведенный выше код работает без ошибок.
Может ли кто-нибудь помочь мне с этой проблемой, чтобы результаты в конечном итоге выглядели так, как показано ниже. Если потребуется, я с радостью отвечу на дополнительные вопросы. Заранее большое спасибо всем, кто смотрит на мой вопрос :-)
Целевые результаты (рассчитанные в Excel):
id name fyear xrd xrd_stock Calculation for xrd_stock
1 Cosco 2000 49 213 =49/(0.08+0.15)
1 Cosco 2001 93 274 =93+(1-0.15)*213
1 Cosco 2002 121 354 …
1 Cosco 2003 84 385 …
1 Cosco 2004 37 364 …
2 Apple 2003 197 857 =197/(0.08+0.15)
2 Apple 2004 36 764 =36+(1-0.15)*857
2 Apple 2005 154 803 …
3 BP 2005 104 452 …
3 BP 2006 116 500 …
3 BP 2007 6 431 …
3 BP 2008 21 388 …