2015-06-08 2 views
4

У меня есть кадр данных значений, состоящий из 5 переменных (класс в скобках)Извлечение рядов наблюдений из dataframe для полных наборов данных

1) DateTime (as.POSIXct), 2) идентификатор (символ), 3) Датчик 1 (числовой), 4) Датчик 2 (числовой), 5) Датчик 3 (числовой)

Данные получены от 5-ти меченых рыб. У каждой рыбы есть одна метка с тремя датчиками на ней, и каждый датчик имеет уникальный идентификатор (таким образом, 5 бит по 4 идентификатора/тега = 15 уникальных идентификаторов). Датчики регистрируют измерения, связанные друг с другом, и таким образом записывают эти измерения одновременно. Данные измерений отправляются в том же порядке каждый раз (ID = A, затем B, затем C). Эти данные отправляются слушающим приемникам, которые могут получать только одну передачу за раз. Чтобы избежать одновременного добавления нескольких тегов и, возможно, никогда не получающих данных, каждый датчик отправляется в произвольный интервал (между 2-4 минутами) до сбора нового набора измерений и перезапускания цикла. Но со случайными интервалами иногда несколько тегов пытаются отправить данные одновременно, и поэтому эти измерения не будут записаны. Пример данных обеспечивается для одной рыбы ниже:

> head(dat,15) 

        DateTime ID Sensor1 Sensor2 Sensor3 
    446 2015-05-15 19:05:41 B  NA 10.2  NA 
    464 2015-05-15 19:14:20 B  NA 10.2  NA 
    475 2015-05-15 19:17:32 C  NA  NA 10.58824 
    486 2015-05-15 19:19:52 A 1.999499  NA  NA 
    499 2015-05-15 19:22:31 B  NA 10.2  NA 
    515 2015-05-15 19:28:10 A 1.999499  NA  NA 
    523 2015-05-15 19:30:56 B  NA 10.1  NA 
    542 2015-05-15 19:37:22 A 1.999499  NA  NA 
    559 2015-05-15 19:41:09 B  NA 10.2  NA 
    574 2015-05-15 19:44:47 C  NA  NA 10.50980 
    613 2015-05-15 19:50:23 B  NA 10.3  NA 
    633 2015-05-15 19:53:07 C  NA  NA 10.50980 
    650 2015-05-15 19:56:32 A 1.999499  NA  NA 
    684 2015-05-15 20:02:49 C  NA  NA 10.50980 
    702 2015-05-15 20:05:51 A 1.999499  NA  NA 

Моя проблема становится пытается извлечь только полные наборы данных, то есть циклы, где A ID, в В, и С все обнаруженные для тега из того же цикла , поэтому данные из трех датчиков могут использоваться вместе. Если идентификатор был пропущен в цикле, я не хочу никаких измерений из этого цикла. В приведенном выше примере есть только один цикл, который я хочу сохранить (строки, начинающиеся с цифр 542, 559 и 574.)

После того как я удалил все неполные циклы, я хотел бы объединить каждый цикл в одно наблюдение, поэтому у меня есть новый фрейм данных, где каждая строка представляет цикл, а все 3 переменные датчика имеют значения. Было бы также полезно рассчитать время между идентификаторами A и C, чтобы я мог проверить, что они из одного цикла, а не ситуация, когда одни и те же идентификаторы могли быть пропущены несколько раз подряд, но порядок все еще работает (шансы это происходит очень, очень мало).

До сих пор я пытался использовать цикл for для извлечения строк dat, где отображается правильный порядок, и помещать эти строки в новый фрейм данных. Я не уверен, как заставить R читать мои критерии как условное утверждение и как выполнить критерии из трех разных наблюдений, прежде чем выполнять то, что я хочу, чтобы цикл делал. Я был бы счастлив сделать это иначе, чем использовать цикл, если это возможно. Вот пример моего цикла ниже (я знаю, что я не вызываю значение True или False для проверки на состояние == TRUE, я просто не уверен, как это сделать для каждой строки):

#make blank dataframe  
output <- data.frame (DateTime=rep(as.POSIXct(NA, tz="UTC"), length(tag123o$Transmitter)), 
          ID=rep(as.character(NA), length(tag123o$Transmitter)), 
          Sensor1=rep(as.numeric(NA), length(tag123o$Transmitter)), 
          Sensor2=rep(as.numeric(NA), length(tag123o$Transmitter)), 
          Sensor3=rep(as.numeric(NA), length(tag123o$Transmitter))) 

    for (i in 1:length(dat$ID)) { 
     if (((dat[i,names(dat)=="ID"] == "A69-1105-123") & 
     (dat[i+1,names(dat)=="ID"] == "A69-1105-124") & 
      (dat[i+2,names(dat)=="ID"] == "A69-1105-125"))==TRUE) { 
      output[i,] <- cbind(dat[i,], data.frame(Cycle=i)) 
      output[i+1,] <- cbind(dat[i+1,], data.frame (Cycle=i)) 
      output[i+2,] <- cbind(dat[i+2,], data.frame(Cycle=i)) 
      } 
    } 

ответ

3

Ваш вопрос сводится к поиску последовательностей «ABC» в пределах последовательностей идентификаторов:

(matches <- gregexpr("ABC", paste(dat$ID, collapse=""))[[1]]) 
# [1] 8 
# ... 

Это свидетельствует о том, что единственный матч начинается в строке 8. Теперь вы знаете, что информация для sENSOR1 находятся в строках пронумерованный matches, информация для Sensor2 находится в строках с номерами matches+1, а информация для Sensor3 находится в строках с номерами matches+2. Это позволяет эффективно построить нужный кадр данных, который сочетает в себе информацию для циклов:

data.frame(DateTime1 = dat$DateTime[matches], 
      DateTime2 = dat$DateTime[matches+1], 
      DateTime3 = dat$DateTime[matches+2], 
      Sensor1 = dat$Sensor1[matches], 
      Sensor2 = dat$Sensor2[matches+1], 
      Sensor3 = dat$Sensor3[matches+2]) 
#    DateTime1   DateTime2   DateTime3 Sensor1 Sensor2 Sensor3 
# 1 2015-05-15 19:37:22 2015-05-15 19:41:09 2015-05-15 19:44:47 1.999499 10.2 10.5098 

Теперь вы можете делать любые вычисления, которые вы хотите дополнительно фильтровать информацию (например, удаление циклов, где разница во времени между измерениями слишком велико).

Смежные вопросы