Переменная подсчета по подгруппе и по времени - PullRequest
1 голос
/ 26 июня 2019

Я работаю с данными панели. В частности, я имею дело с данными, которые структурированы для анализа продолжительности. Я смотрю, когда штат США принимает политику. У меня есть около 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 ]

2 голосов
/ 26 июня 2019

РЕДАКТИРОВАТЬ

На основе комментариев и ответа @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
0 голосов
/ 27 июня 2019

Мне потребовалось некоторое время, и я не уверен, что это самый простой ответ, но это сработало!

df1= df1%>%  mutate(ID = group_indices_( df1, .dots=c("policy", "year")))
df12=aggregate(df1$adopt, by=list(ID= df1$ID), FUN=sum)
df1=merge(df1, df12, by=c("ID"))
df1$adopt2= df1$x
df12= df1%>% select(ID, adopt2, policy)
df12=unique(df12)
df12$adopt3 <- do.call(c, tapply(df12$adopt2, df12$policy, FUN=cumsum))
df12$adopt4= df12$adopt3- df12$adopt2
df13=merge(df1, df12, by=c("policy"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...