У меня есть набор данных, в который в разное время были взяты несколько образцов разных типов от одного и того же человека, который дал мне набор данных, который выглядит следующим образом
Patient SampleType Collection-Date
1 A 15-02-2001
1 B 15-02-2001
2 A 19-02-2001
2 B 19-02-2001
3 A 16-05-2001
3 B 16-05-2001
1 A 16-03-2001
1 B 16-03-2001
3 B 05-03-2001
Обратите внимание, что дата указывается в формате день-месяц-год. В R я хотел бы создать новую переменную, которую я могу использовать для определения того, к какому моменту времени относится каждый образец, чтобы получить следующий вывод.
Patient SampleType Collection-Date TimePoint
1 A 15-02-2001 T1
1 B 15-02-2001 T1
2 A 19-02-2001 T1
2 B 19-02-2001 T1
3 A 16-05-2001 T1
3 B 16-05-2001 T1
1 A 16-03-2001 T2
1 B 16-03-2001 T2
3 B 05-03-2001 T2
Я разработал, как это сделать, в основном используя следующий код:
#generate a key to connect Patients and samples
df<-mutate(df, Key=paste(df$Patient,df$SampleType, sep = "")
#Create a list of Keys
KeyList <- list(df$Key)
#Separate the original data frame based on Key
#Create new dataframes for all values of Key
for (i in unique(DateComp$Key)){
nam<-paste("df", i, sep = ".")
assign(nam, DateComp[DateComp$Key== i,])
}
Это генерирует уникальный фрейм данных для каждой комбинации типа пациент-образец
Затем я могу создать желаемый результат, выполнив следующие действия:
df.1A[order(as.Date(1A$Collection-Date, format="%d%m%Y")),]
rownames(df.1A)= NULL
df.1A <- mutate(df.1A, TimePoint = paste("TP", row_number(),sep=""))
Это в основном создает желаемый результат для пациента 1, тип образца A, так как он читается
Patient SampleType Collection-Date Key TimePoint
1 A 15-02-2001 1A TP1
1 A 16-03-2001 1A TP2
Однако у меня есть две проблемы с этим подходом:
1) Я должен вручную написать код для каждого уникально созданного фрейма данных
(поэтому, если кто-нибудь может объяснить, как я могу сделать это, используя функцию lapply или аналогичную, я был бы очень признателен)
2) Если у Пациента есть только определенный тип образца для его второго посещения, тогда он будет помечен как момент времени 1, а не как момент времени 2
Кто-нибудь знает, как я мог бы переписать код, чтобы это не было проблемой?
Заранее спасибо!