我遇到以下问题,但似乎找不到解决该问题的好方法。假设我有一个面板数据集,其中包含接受治疗的对象(在不同时间)。
可复制的示例:
df <- data.frame(subject = rep(c("A", "B"), each = 6),
period = rep(c(2006:2011), 2),
treatment = c(0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0))
现在,我想创建一个指标变量“ post”,该值在治疗后的所有期间都等于1,这样数据看起来像这样:
subject period treatment post
1 A 2006 0 0
2 A 2007 1 1
3 A 2008 0 1
4 A 2009 0 1
5 A 2010 0 1
6 A 2011 0 1
7 B 2006 0 0
8 B 2007 0 0
9 B 2008 1 1
10 B 2009 0 1
11 B 2010 0 1
12 B 2011 0 1
我尝试使用滞后等解决它,但是代码变得不必要的混乱。解决这个问题的一种优雅方法是什么?
谢谢
答案 0 :(得分:1)
您可以使用ave()
。
transform(df, post = ave(treatment == 1, subject, FUN = cumsum))
# subject period treatment post
# 1 A 2006 0 0
# 2 A 2007 1 1
# 3 A 2008 0 1
# 4 A 2009 0 1
# 5 A 2010 0 1
# 6 A 2011 0 1
# 7 B 2006 0 0
# 8 B 2007 0 0
# 9 B 2008 1 1
# 10 B 2009 0 1
# 11 B 2010 0 1
# 12 B 2011 0 1
答案 1 :(得分:1)
带有“ tidyverse”:
df %>%
group_by(subject) %>%
arrange(subject,period) %>%
mutate(post= cumsum(treatment))
# A tibble: 12 x 4
# Groups: subject [2]
subject period treatment post
<fct> <int> <dbl> <dbl>
1 A 2006 0 0
2 A 2007 1 1
3 A 2008 0 1
4 A 2009 0 1
5 A 2010 0 1
6 A 2011 0 1
7 B 2006 0 0
8 B 2007 0 0
9 B 2008 1 1
10 B 2009 0 1
11 B 2010 0 1
12 B 2011 0 1