R处理后更改向量的值

时间:2018-12-22 20:02:25

标签: r vector

我遇到以下问题,但似乎找不到解决该问题的好方法。假设我有一个面板数据集,其中包含接受治疗的对象(在不同时间)。

可复制的示例:

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

我尝试使用滞后等解决它,但是代码变得不必要的混乱。解决这个问题的一种优雅方法是什么?

谢谢

2 个答案:

答案 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