Я пытаюсь переформатировать продольные данные для анализа времени. В приведенных ниже примерах данных я просто хочу найти самую раннюю неделю, когда результат был «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 способ решения этой проблемы с данными?