Если значение появляется в строке, все последующие строки должны принимать это значение (с помощью dplyr) - PullRequest
0 голосов
/ 30 октября 2018

Я только начинаю изучать 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 голосов
/ 30 октября 2018

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