Полные нули с предыдущим значением +1 - PullRequest
0 голосов
/ 23 января 2019

У меня есть запись, сгруппированная по пользователям. В переменной «день» есть несколько нулей, которые я хотел бы заменить в порядке последовательности (= предыдущее значение +1).

data <- data.frame(user = c(1,1,1,2,2,2,2,2), day = c(170,0,172,34,35,0,0,38))

data
  user day
1    1 170
2    1   0
3    1 172
4    2  34
5    2  35
6    2   0
7    2   0
8    2  38

Я хочу получить следующее:


data_new
  user day
1    1 170
2    1 171
3    1 172
4    2  34
5    2  35
6    2  36
7    2  37
8    2  38

Я пробовал следующее (действительно неэффективно и работает не во всех случаях ...):

data = group_by(data, user) %>%
+   mutate(lead_day = lead(day),
+          day_new = case_when(day == 0 ~ lead_day - 1,
+                              day > 0 ~ day))
> data
# A tibble: 8 x 4
# Groups:   user [2]
   user   day lead_day day_new
  <dbl> <dbl>    <dbl>   <dbl>
1     1   170        0     170
2     1     0      172     171
3     1   172       NA     172
4     2    34       35      34
5     2    35        0      35
6     2     0        0      -1
7     2     0       38      37
8     2    38       NA      38

1 Ответ

0 голосов
/ 23 января 2019

Вы можете использовать Reduce

data$day <-Reduce(function(x,y) if(y==0) x+1 else y, data$day,accumulate = TRUE)   
data
#   user day
# 1    1 170
# 2    1 171
# 3    1 172
# 4    2  34
# 5    2  35
# 6    2  36
# 7    2  37
# 8    2  38

Или, как вы используете tidyverse уже:

data %>% mutate(day = accumulate(day,~if(.y==0) .x+1 else .y))
#   user day
# 1    1 170
# 2    1 171
# 3    1 172
# 4    2  34
# 5    2  35
# 6    2  36
# 7    2  37
# 8    2  38
...