Условное приращение Тидиверс - PullRequest
0 голосов
/ 27 июня 2018

Я довольно безуспешно гуглял, как условно увеличивать тидиверс. То, что я хочу сделать, это проверить, если значение в столбце больше, чем x, и, если это так, увеличить целое число на единицу. Каждое наблюдение начинается с 1.

Пример кода:

id = c(1, 1, 1, 2, 3, 3, 3, 3, 4)
time = c(20, 30, 101, 33, 50, 101, 30, 110, 30)

df_x = data.frame(id = id, time = time)

Выход:

  id time
1  1   20
2  1   30
3  1  101
4  2   33
5  3   50
6  3  101
7  3   30
8  3  110
9  4   30

Желаемый выход:

increment = c(1, 1, 2, 1, 1, 2, 2, 3, 1)

df_x$increment = increment

   id time increment
1  1   20         1
2  1   30         1
3  1  101         2
4  2   33         1
5  3   50         1
6  3  101         2 
7  3   30         2
8  3  110         3
9  4   30         1

Код для него будет выглядеть примерно так:

df_x %>%
  group_by(id) %>%
  mutate(ifelse(time <= 100, ?, ?))

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 27 июня 2018

Это можно сделать с помощью накопленной суммы, которая увеличивается каждый раз, когда значение больше 100, например:

df_x %>% 
  group_by(id) %>% 
  mutate(increment = 1 + cumsum(time > 100))

# A tibble: 9 x 3
# Groups:   id [4]
     id  time increment
  <dbl> <dbl>     <dbl>
1    1.   20.        1.
2    1.   30.        1.
3    1.  101.        2.
4    2.   33.        1.
5    3.   50.        1.
6    3.  101.        2.
7    3.   30.        2.
8    3.  110.        3.
9    4.   30.        1.

Я использовал 1 + cumsum(...), чтобы начать первую группу с 1 вместо 0. Не то чтобы группа могла начинаться с 2, если первое значение> 100 в данной id-группе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...