Как создавать новые столбцы в R каждый раз, когда заданное значение появляется? - PullRequest
0 голосов
/ 31 октября 2018

У меня есть вопрос относительно создания новых столбцов, если в существующей строке появляется определенное значение.

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 голосов
/ 31 октября 2018

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...