Преобразование продольных данных для анализа времени до события в R - PullRequest
1 голос
/ 11 апреля 2020

Я пытаюсь переформатировать продольные данные для анализа времени. В приведенных ниже примерах данных я просто хочу найти самую раннюю неделю, когда результат был «0» для каждого идентификатора.

Спецификация c У меня есть вопрос о том, как пациентам, которые не преобразовали в 0 и имели все 1 или 2. В данных примера пациент J имеет все 1.

#Sample data
have<-data.frame(patient=rep(LETTERS[1:10], each=9),
                 week=rep(0:8,times=10),
                 result=c(1,0,2,rep(0,6),1,1,2,1,rep(0,5),1,1,rep(0,7),1,rep(0,8),
                          1,1,1,1,2,1,0,0,0,1,1,1,rep(0,6),1,2,1,rep(0,6),1,2,rep(0,7),
                          1,rep(0,8),rep(1,9)))
patient week result
A       0   1
A       1   0
A       2   2
A       3   0
A       4   0
A       5   0
A       6   0
A       7   0
A       8   0
B       0   1
B       1   0
...     .....
J       6   1
J       7   1
J       8   1

Я могу выполнить этот относительно простой процесс с помощью следующего кода:

want<-aggregate(have$week, by=list(have$patient,have$result), min) want<-want[which(want[2]==0),]

, но понимаю, что если кто-то не преобразует в 0, это исключает их (в данном примере пациент J исключен). Вместо этого J должен присутствовать с 1 во втором столбце и 8 в третьем столбце. Вместо этого он, конечно, опущен

print(want)
Group.1 Group.2 x
A       0       1
B       0       4
C       0       2
D       0       1
E       0       6
F       0       3
G       0       3
H       0       2
I       0       1
#But also need
J       1       8

В соответствии с инструкциями по публикации здесь, я работал, чтобы решить эту проблему, я могу получить то, что мне нужно очень не элегантно:

mins<-aggregate(have$week, by=list(have$patient,have$result), min)
maxs<-aggregate(have$week, by=list(have$patient,have$result), max)
want<-rbind(mins[which(mins[2]==0),],maxs[which(maxs[2]==1&maxs[3]==8),])

Это возвращает правильный желаемый набор данных, но кодирование ужасное и неустойчивое, так как я работаю с другими наборами данных (т.е. с наборами данных с разными таймфреймами, так как мне приходится вручную вводить maxsp[3]==8, et c).

Есть ли более элегантный или систематический c способ решения этой проблемы с данными?

1 Ответ

1 голос
/ 11 апреля 2020

Мы можем написать функцию для выбора строки из группы.

select_row <- function(result, week) {
   if(any(result == 0)) which.max(result == 0) else which.max(week)
}

Эта функция возвращает индекс первого значения 0, если оно присутствует, или возвращает индекс максимального значения week.

и примените его ко всем группам.

library(dplyr)
have %>% group_by(patient) %>% slice(select_row(result, week))

#  patient  week result
#   <fct>   <int>  <dbl>
# 1 A           1      0
# 2 B           4      0
# 3 C           2      0
# 4 D           1      0
# 5 E           6      0
# 6 F           3      0
# 7 G           3      0
# 8 H           2      0
# 9 I           1      0
#10 J           8      1
...