Я работаю над переформатированием большого набора данных о качестве воды для обратной связи с базой данных. Когда добровольцы берут данные, они часто используют пробу воды для нескольких тестов и записывают ее как тот же номер пробы, дату и время. Однако база данных не примет это и требует, чтобы время выборки было другим. Исторически решением этой проблемы было добавление секунды к каждому последующему измерению для того же номера образца. Например,
Sample Number DateTime
180433 2019-11-04 12:30:00
180433 2019-11-04 12:30:00
180433 2019-11-04 12:30:00
180433 2019-11-04 12:30:00
180433 2019-11-04 12:30:00
тогда мне нужно время 12:30:00, 12:30:01, 12:30:02, 12:30:03, 12:30:04. Хотя я написал некоторый код для этого, он немного неуклюж, и я знаю, что должен быть более элегантный метод.
LIMS_dup<-LIMS_data[duplicated(LIMS_data[,c(4,8:9)]),c(4,8:9)]
x<-NA
for (i in 1:length(unique(LIMS_dup$CustomerSampleNumber))){
x<-which(as.integer(LIMS_data$CustomerSampleNumber)==as.integer(unique(LIMS_dup$CustomerSampleNumber)[i]))
if (length(x)>1){
for (j in 2:length(x)){
LIMS_data$CollectTime[x[j]]<-LIMS_data$CollectTime[x[j-1]]+1
}
}
}
Где LIMS_data - мой главный тиббл, а LIMS_dup - тиббл повторяющихся номеров образцов и времени. Это работает, но это немного медленно. Я надеялся найти лучший метод, особенно тот, который не использует вложенные циклы.