Как создать переменную, которая увеличивается на 1 в зависимости от значения другой переменной? - PullRequest
0 голосов
/ 28 декабря 2018

Скажем, у меня есть такой набор данных:

id <- rep(1, 9)
start_over <- c(rep(NA, 3), "yes", NA, "yes", rep(NA, 3))
dat <- data.frame(id, start_over)

Т.е.,

    id  start_over
1   1   NA
2   1   NA 
3   1   NA
4   1   yes
5   1   NA
6   1   yes
7   1   NA
8   1   NA
9   1   NA

Как мне создать новую переменную, которая увеличивается на единицу каждый раз, когда start_over равен "yes",

т.е.

    id  start_over   assignment
1   1   NA           1
2   1   NA           1
3   1   NA           1
4   1   yes          2
5   1   NA           2
6   1   yes          3
7   1   NA           3
8   1   NA           3
9   1   NA           3

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Небольшое улучшение моего комментария:

dat$assignment <- cumsum(dat$start_over %in% "yes") + 1

, что дает:

> dat
  id start_over assignment
1  1       <NA>          1
2  1       <NA>          1
3  1       <NA>          1
4  1        yes          2
5  1       <NA>          2
6  1        yes          3
7  1       <NA>          3
8  1       <NA>          3
9  1       <NA>          3
0 голосов
/ 28 декабря 2018

NA можно определить только с помощью функции is.na(), а затем cumsum() логических значений.

library(dplyr)
dat %>% mutate(x = cumsum(!is.na(start_over)) + 1)

#   id start_over x
# 1  1       <NA> 1
# 2  1       <NA> 1
# 3  1       <NA> 1
# 4  1        yes 2
# 5  1       <NA> 2
# 6  1        yes 3
# 7  1       <NA> 3
# 8  1       <NA> 3
# 9  1       <NA> 3
0 голосов
/ 28 декабря 2018

Мы можем использовать функцию cumsum:

cumsum(dat$start_over == "yes" & !is.na(dat$start_over)) + 1
# [1] 1 1 1 2 2 3 3 3 3

Мы проверяем, равно ли start_over «да» и не равно NA.Если эти условия выполняются, мы вернем 1, в противном случае он вернет 0. Нам нужно добавить 1 к cumsum, иначе присвоение начнется с 0.

dat$assignment <- cumsum(dat$start_over == "yes" & !is.na(dat$start_over)) + 1

#   id start_over assignment
# 1  1       <NA>          1
# 2  1       <NA>          1
# 3  1       <NA>          1
# 4  1        yes          2
# 5  1       <NA>          2
# 6  1        yes          3
# 7  1       <NA>          3
# 8  1       <NA>          3
# 9  1       <NA>          3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...