如果该行中出现一个值,则所有后续行都应使用该值(使用dplyr)

时间:2018-10-30 10:05:43

标签: r dplyr

我刚刚开始学习R,并且已经面临第一个更大的问题。

让我们以以下面板数据集为例:

N=5
T=3
time<-rep(1:T, times=N)
id<- rep(1:N,each=T)
dummy<- c(0,0,1,1,0,0,0,1,0,0,0,1,0,1,0)
df<-as.data.frame(cbind(id, time,dummy))

   id time dummy
1   1    1     0
2   1    2     0
3   1    3     1
4   2    1     1
5   2    2     0
6   2    3     0
7   3    1     0
8   3    2     1
9   3    3     0
10  4    1     0
11  4    2     0
12  4    3     1
13  5    1     0
14  5    2     1
15  5    3     0

我现在希望该横截面的所有行的虚拟变量在该横截面的1首次出现后取1。所以,我想要的是:

   id time dummy
1   1    1     0
2   1    2     0
3   1    3     1
4   2    1     1
5   2    2     1
6   2    3     1
7   3    1     0
8   3    2     1
9   3    3     1
10  4    1     0
11  4    2     0
12  4    3     1
13  5    1     0
14  5    2     1
15  5    3     1

所以我想我需要类似的东西:

df_new<-df %>%
   group_by(id) %>%
   ??? 

我已经尝试将所有零设置为NA并使用na.locf函数,但实际上并没有用。

有人知道吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

使用cummax

df %>%
  group_by(id) %>%
  mutate(dummy = cummax(dummy))
# A tibble: 15 x 3
# Groups:   id [5]
#      id  time dummy
#   <dbl> <dbl> <dbl>
# 1     1     1     0
# 2     1     2     0
# 3     1     3     1
# 4     2     1     1
# 5     2     2     1
# 6     2     3     1
# 7     3     1     0
# 8     3     2     1
# 9     3     3     1
#10     4     1     0
#11     4     2     0
#12     4     3     1
#13     5     1     0
#14     5     2     1
#15     5     3     1

没有其他软件包,您可以做

transform(df, dummy = ave(dummy, id, FUN = cummax))