#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