我正在处理面板数据。具体来说,我正在处理为持续时间分析而构造的数据。我正在查看美国某州何时采取政策。我有大约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))
答案 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
原始答案
我们可以用arrange
和year
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()