每当出现给定值时,如何在R中创建新列?

时间:2018-10-31 09:25:11

标签: r

如果在现有行中出现某个值,我有一个关于创建新列的问题。

N=5
T=5
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,0,0,0,0,0,1,0,0,1,0)
df <- data.frame(id, time, dummy)

   id time dummy
1   1    1     0
2   1    2     0
3   1    3     1
4   1    4     1
5   1    5     0
6   2    1     0
7   2    2     0
8   2    3     1
9   2    4     0
10  2    5     0
11  3    1     0
12  3    2     1
13  3    3     0
14  3    4     1
15  3    5     0
16  4    1     0
17  4    2     0
18  4    3     0
19  4    4     0
20  4    5     0
21  5    1     1
22  5    2     0
23  5    3     0
24  5    4     1
25  5    5     0

在这种情况下,我们有一些横截面,其中出现多个1。现在,我尝试为每个附加的1创建一个新的虚拟变量/列。此后,对于每个虚拟,每个横截面的行也应在第一个1出现后用1填充。我可以通过在每一列上使用group_by(id)和cummax函数来填充行。但是,如何在不手动检查每个横截面的情况下获取新变量?所以我要实现以下目标:

   id time dummy dummy2
1   1    1     0      0
2   1    2     0      0
3   1    3     1      0
4   1    4     1      1
5   1    5     1      1
6   2    1     0      0
7   2    2     0      0
8   2    3     1      0
9   2    4     1      0
10  2    5     1      0
11  3    1     0      0
12  3    2     1      0
13  3    3     1      0
14  3    4     1      1
15  3    5     1      1
16  4    1     0      0
17  4    2     0      0
18  4    3     0      0
19  4    4     0      0
20  4    5     0      0
21  5    1     1      0
22  5    2     1      0
23  5    3     1      0
24  5    4     1      1
25  5    5     1      1

谢谢! :)

1 个答案:

答案 0 :(得分:1)

您可以使用cummax,并且需要cumsum来创建dummy2

df %>% 
  group_by(id) %>% 
  mutate(dummy1 = cummax(dummy), # don't alter 'dummy' here we need it in the next line
         dummy2 = cummax(cumsum(dummy) == 2)) %>% 
  as.data.frame() # needed only to display the entire result
#   id time dummy dummy1 dummy2
#1   1    1     0      0      0
#2   1    2     0      0      0
#3   1    3     1      1      0
#4   1    4     1      1      1
#5   1    5     0      1      1
#6   2    1     0      0      0
#7   2    2     0      0      0
#8   2    3     1      1      0
#9   2    4     0      1      0
#10  2    5     0      1      0
#11  3    1     0      0      0
#12  3    2     1      1      0
#13  3    3     0      1      0
#14  3    4     1      1      1
#15  3    5     0      1      1
#16  4    1     0      0      0
#17  4    2     0      0      0
#18  4    3     0      0      0
#19  4    4     0      0      0
#20  4    5     0      0      0
#21  5    1     1      1      0
#22  5    2     0      1      0
#23  5    3     0      1      0
#24  5    4     1      1      1
#25  5    5     0      1      1