Проблема итерации без использования цикла в R - PullRequest
0 голосов
/ 02 июля 2019

Так что у меня разные посетители, каждый из которых приходил более одного раза.

По датам посещения я получил интервалы посещения для каждого пациента.

Я хочу назначить эпизоды для каждого посещения каждого пациента в зависимости от их пробелов. Для Gap=0 (т. Е. 1-й визит любого нового пациента), Episode=1. Если Gap>20, Episode=previous episode+1, если Gap<=20, Episode=previous Episode. И все начинается снова для нового пациента. Я хочу сделать это без использования цикла в R, предпочтительно в dplyr.

Данные:

Df <- data.frame(Visitors = c("V1","V1","V1","V1","V1","V1","V1","V2","V2","V2","V2","V2","V2","V3"),
Gap=c(0,6,18,35,43,9,11,0,3,67,98,12,2,0))

Это ожидаемая таблица:

Visitors Gap Episodes
    V1     0    1
    V1     6    1
    V1    18    1
    V1    35    2
    V1    43    3
    V1     9    3
    V1    11    3
    V2     0    1
    V2     3    1
    V2    67    2
    V2    98    3
    V2    12    3
    V2     2    3
    V3     0    1

1 Ответ

0 голосов
/ 02 июля 2019

Вот решение dplyr.После того, как вы разбили вектор Df на группы по посетителям, он кумулятивно подсчитывает, сколько разрывов было больше 20.

require(dplyr)
Df %>% group_by(Visitors) %>% mutate(episode=cumsum(Gap>20)+1)
# A tibble: 14 x 3
# Groups:   Visitors [3]
   Visitors   Gap episode
   <fct>    <dbl>   <dbl>
 1 V1           0       1
 2 V1           6       1
 3 V1          18       1
 4 V1          35       2
 5 V1          43       3
 6 V1           9       3
 7 V1          11       3
 8 V2           0       1
 9 V2           3       1
10 V2          67       2
11 V2          98       3
12 V2          12       3
13 V2           2       3
14 V3           0       1

И вот базовое решение R, которое делает то же самое:

Df$ep<-unlist(sapply(split(Df, Df$Visitors),function(x) cumsum(x[,"Gap"]>20)+1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...