按子组和随时间计数变量

时间:2019-06-26 09:02:44

标签: r count grouping

我正在处理面板数据。具体来说,我正在处理为持续时间分析而构造的数据。我正在查看美国某州何时采取政策。我有大约500种不同的政策,50个州,数据跨越40年。在R中,我想构造一个新变量,该变量是对前几年采用该政策的州数的计数。

这是数据集的一个示例(在一个策略区域中标记为“ A”)。 “州”是州的名称。 “政策”是特定的政策领域。 “采用”是指一个州是否在给定的“年度”中正式实施了一项政策。标为零的观察结果表示未采用该政策,而标有1的观察结果表示该年采用了该政策。

State   Year    Policy  Adopt
1       1970    A       0
1       1971    A       0
1       1972    A       1
2       1970    A       0
2       1971    A       0
2       1972    A       0
2       1973    A       1
3       1970    A       0
3       1971    A       0
3       1972    A       0  
3       1973    A       0
3       1974    A       1

我希望新的数据集看起来像这样。

State   Year    Policy  Adopt   Adopters_Count
1       1970    A       0       0
1       1971    A       0       0
1       1972    A       1       0
2       1970    A       0       0
2       1971    A       0       0
2       1972    A       0       0
2       1973    A       1       1
3       1970    A       0       0
3       1971    A       0       0
3       1972    A       0       0
3       1973    A       0       1
3       1974    A       1       2

有人有建议或R代码可能产生这样的变量吗?感谢您的帮助

以下是生成样本数据集的代码:

df1 <- data.frame(State = c(1,1,1,2,2,2,2,3,3,3,3,3), year=c(1970,1971,1972, 1970,1971,1972,1973,1970,1971,1972,1973,1974), Policy=c("A","A","A","A","A","A","A","A","A","A","A","A"), Adopt=c(0,0,1,0,0,0,1,0,0,0,0,1))

2 个答案:

答案 0 :(得分:2)

编辑

基于@Dyllan的评论和回答,我认为我们可以使用以下内容。

df %>%
  group_by(Policy, year) %>%
  summarise(adopt2 = sum(Adopt)) %>%
  group_by(Policy) %>%
  mutate(adopt3 = cumsum(adopt2) - adopt2) %>%
  inner_join(df, by = "Policy") 

# A tibble: 60 x 7
# Groups:   Policy [1]
#   Policy year.x adopt2 adopt3 State year.y Adopt
#   <fct>   <dbl>  <dbl>  <dbl> <dbl>  <dbl> <dbl>
# 1 A        1970      0      0     1   1970     0
# 2 A        1970      0      0     1   1971     0
# 3 A        1970      0      0     1   1972     1
# 4 A        1970      0      0     2   1970     0
# 5 A        1970      0      0     2   1971     0
# 6 A        1970      0      0     2   1972     0
# 7 A        1970      0      0     2   1973     1
# 8 A        1970      0      0     3   1970     0
# 9 A        1970      0      0     3   1971     0
#10 A        1970      0      0     3   1972     0
# … with 50 more rows

原始答案

我们可以用arrangeyear Policy来创建每年的累计采用计数,然后将其减去1,因为我们想知道在当前政策之前采用了多少种政策年。我们在此处使用pmax,因为我们不希望在不采用该政策的年份中计数为-1。同样,group_by(Policy)不会影响所提供的示例数据集中的任何内容,因为我们只有一个Policy,但实际数据集中是必需的。

library(dplyr)

df1 %>%
  arrange(year, Policy) %>%
  group_by(Policy) %>%
  mutate(Adopters_Count = pmax(cumsum(Adopt) - 1, 0)) %>%
  arrange(State)

#  State  year Policy Adopt Adopters_Count
#   <dbl> <dbl> <fct>  <dbl>          <dbl>
# 1     1  1970 A          0              0
# 2     1  1971 A          0              0
# 3     1  1972 A          1              0
# 4     2  1970 A          0              0
# 5     2  1971 A          0              0
# 6     2  1972 A          0              0
# 7     2  1973 A          1              1
# 8     3  1970 A          0              0
# 9     3  1971 A          0              0
#10     3  1972 A          0              0
#11     3  1973 A          0              1
#12     3  1974 A          1              2

答案 1 :(得分:0)

我花了一段时间,但我不确定这是最直接的答案,但是确实有效!

form.submit()