Как добавить новый столбец на основе условной разницы между строками

#r #conditional-statements #row #calculated-columns

#r #условные операторы #строка #вычисляемые столбцы

Вопрос:

У меня есть большой набор данных идентификаторов пациентов с задержками в днях между сеансами хирургии и лучевой терапии (RT). У некоторых пациентов может быть два или три курса лечения РТ. Чтобы идентифицировать этих пациентов, я считаю, что задержка превышает 91 день (3 месяца). Эта задержка в 91 день соответствует окончанию одной обработки RT и началу другой. Для целей анализа он может быть установлен на 61 день (2 месяца). Как соотнести задержку выше 91 дня между двумя значениями с новой обработкой RT и добавить соответствующий порядок в новый столбец? Моя база данных выглядит следующим образом:

 df1 <- data.frame (
id = c("a","a","a","a","b","b","b","b","b","b","b","b","b","b","b","b","b", "c","c","c","c"), 
delay = c(2,3,5,6, 3,5,7,9, 190,195,201,203,205, 1299,1303,1306,1307, 200,202,204,205))

        > df1
   id delay
1   a     2
2   a     3
3   a     5
4   a     6
5   b     3
6   b     5
7   b     7
8   b     9
9   b   190
10  b   195
11  b   201
12  b   203
13  b   205
14  b  1299
15  b  1303
16  b  1306
17  b  1307
18  c   200
19  c   202
20  c   204
21  c   205
  

Мне не удалось создать что-то подобное, учитывая, что время между первым набором задержек превышает 100 дней.

 df2 <- data.frame (
id = c("a","a","a","a","b","b","b","b","b","b","b","b","b","b","b","b","b", "c","c","c","c"), 
delay = c(2,3,5,6, 3,5,7,9, 190,195,201,203,205, 1299,1303,1306,1307, 200,202,204,205),
tt_order = c("1st","1st","1st","1st"," 1st","1st","1st","1st"," 2nd","2nd","2nd","2nd","2nd"," 3rd","3rd","3rd","3rd"," 1st","1st","1st","1st"))

        > df2
   id delay tt_order
1   a     2      1st
2   a     3      1st
3   a     5      1st
4   a     6      1st
5   b     3      1st
6   b     5      1st
7   b     7      1st
8   b     9      1st
9   b   190      2nd
10  b   195      2nd
11  b   201      2nd
12  b   203      2nd
13  b   205      2nd
14  b  1299      3rd
15  b  1303      3rd
16  b  1306      3rd
17  b  1307      3rd
18  c   200      1st
19  c   202      1st
20  c   204      1st
21  c   205      1st
  

Я буду благодарен за любую помощь, которую вы можете предоставить.

Комментарии:

1. Почему id остается 2 в строке 11, даже когда delay равно 201?

2. Задержка — это дни после операции, поэтому для идентификатора он может принимать любое значение.

3. Да, но разве мы не хотим увеличивать его на каждые 100 значений? Значит, все значения после 200 до 300 должны быть равны 3?

4. Не совсем. Я перефразировал свой вопрос в oder, чтобы быть более ясным.

Ответ №1:

Одним из способов было бы разделить delay на 100, а затем использовать match и unique для последовательного получения уникального индекса для каждого id .

 library(dplyr)
df2 %>%
  group_by(id) %>%
  mutate(n_tt = floor(delay/100), 
         n_tt = match(n_tt, unique(n_tt)))

#   id    delay tt_order  n_tt
#   <chr> <dbl>    <dbl> <int>
# 1 a         2        1     1
# 2 a         3        1     1
# 3 a         5        1     1
# 4 a         6        1     1
# 5 b         3        1     1
# 6 b         5        1     1
# 7 b         7        1     1
# 8 b         9        1     1
# 9 b       150        2     2
#10 b       152        2     2
#11 b       155        2     2
#12 b       159        2     2
#13 b      1301        3     3
#14 b      1303        3     3
#15 b      1306        3     3
#16 b      1307        3     3
#17 c       200        1     1
#18 c       202        1     1
#19 c       204        1     1
#20 c       205        1     1
  

Создан новый столбец n_tt для целей сравнения с tt_order в df2 .

Комментарии:

1. Здравствуйте. Спасибо за ваш быстрый ответ. Я попробовал ваше решение для моего исходного набора данных, но оно не сработало, создав неправильный порядок, например, для поздних задержек (> 1000 дней) Таким образом, я изменил свой вопрос.

2. @CharlesLDN Когда порядок перезапускается с 1?

3. При изменении идентификатора (a, затем b, затем c …)

4. Я дополнительно изменил свой вопрос, поскольку задержки могут охватывать разные сотни (295, 298, 300, 305).

Ответ №2:

@CharlesLDN — возможно, это может быть то, что вы ищете. Здесь будут рассмотрены различия в задержке внутри каждого id , и промежутки > 90 дней будут считаться новым лечением.

 library(tidyverse)

df1 %>%
  group_by(id) %>%
  mutate(tt_order = cumsum(c(0, diff(delay)) > 90)   1)
  

Вывод

    id    delay tt_order
   <chr> <dbl>    <dbl>
 1 a         2        1
 2 a         3        1
 3 a         5        1
 4 a         6        1
 5 b         3        1
 6 b         5        1
 7 b         7        1
 8 b         9        1
 9 b       190        2
10 b       195        2
11 b       201        2
12 b       203        2
13 b       205        2
14 b      1299        3
15 b      1303        3
16 b      1306        3
17 b      1307        3
18 c       200        1
19 c       202        1
20 c       204        1
21 c       205        1