Избегайте использования циклов на большом наборе данных в R при добавлении секунды к повторным данным - PullRequest
1 голос
/ 04 ноября 2019

Я работаю над переформатированием большого набора данных о качестве воды для обратной связи с базой данных. Когда добровольцы берут данные, они часто используют пробу воды для нескольких тестов и записывают ее как тот же номер пробы, дату и время. Однако база данных не примет это и требует, чтобы время выборки было другим. Исторически решением этой проблемы было добавление секунды к каждому последующему измерению для того же номера образца. Например,

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

1 Ответ

0 голосов
/ 04 ноября 2019

Рассмотрим ave для последовательного подсчета по группам (в данном случае это номер выборки), который будет добавлен к типу POSIXct datetime (т. Е. Добавляет секунды):

df$New_DateTime <- with(df, DateTime + (ave(as.numeric(DateTime), Sample_Number, FUN=seq_along)-1))

df
#   Sample_Number            DateTime        New_DateTime
# 1        180433 2019-11-04 12:30:00 2019-11-04 12:30:00
# 2        180433 2019-11-04 12:30:00 2019-11-04 12:30:01
# 3        180433 2019-11-04 12:30:00 2019-11-04 12:30:02
# 4        180433 2019-11-04 12:30:00 2019-11-04 12:30:03
# 5        180433 2019-11-04 12:30:00 2019-11-04 12:30:04

Демоверсия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...