我正在尝试执行以下逻辑来创建“减”列。我有1986年至2014年的工作时间,大约有100家公司。
year firm count sum_of_year subtract
1986 A 1 2 2
1986 B 1 2 4
1987 A 2 4 5
1987 C 1 4 2
1987 D 1 4 5
1988 C 3 5
1988 E 2 5
也就是说,如果位于t处的公司i出现在t + 1中,则从t + 1]的sum_of_year中减去其在t + 1处的计数,
如果公司i没有出现在t + 1中,则只需将sum_of_year放在t + 1,如示例中所示。
我在创建此条件代码时遇到困难。
如何在通用版本中做到这一点?
谢谢您的帮助。
dplyr
的帮助下使用tidyr::complete
的一种方法。我们用0填写year
和firm
和fill
count
的行的缺失组合。对于每个year
,我们将整个count
的sum
的count
减去year
],最后对于每个firm
,我们使用lead
取下一年的值。
library(dplyr)
df %>%
tidyr::complete(year, firm, fill = list(count = 0)) %>%
group_by(year) %>%
mutate(n = sum(count) - count) %>%
group_by(firm) %>%
mutate(subtract = lead(n)) %>%
filter(count != 0) %>%
select(-n)
# year firm count sum_of_year subtract
# <int> <fct> <dbl> <int> <dbl>
#1 1986 A 1 2 2
#2 1986 B 1 2 4
#3 1987 A 2 4 5
#4 1987 C 1 4 2
#5 1987 D 1 4 5
#6 1988 C 3 5 NA
#7 1988 E 2 5 NA