Как выполнить итеративный поиск в пределах фрейма данных значений, которые находятся между значениями другого фрейма данных?

#r #loops #dataframe #for-loop #iteration

#r #циклы #фрейм данных #for-цикл #итерация

Вопрос:

У меня есть два файла данных, один набор необработанных данных и один файл калибровки. Что я пытаюсь сделать, так это найти время между первым и вторым запуском калибровки и сопоставить его с отрезком времени в файле raw, чтобы проверить данные с использованием линейной регрессии (известный наклон и перехват).

Я возился с циклами for, и я знаю, что это не идеально в R, но сейчас я не вижу другого пути.

Вот пример файлов

 > cal
    time slope intercept pressure
    24.51 2.4 -71 101
    25.61 1.7 -12 101
    ...
    27.12 1.8 -23 102
  

И пример rawdata

 > raw
   time CO2
   24.53 320
   24.54 322
   24.55 322
   ....
   ....
   ....
   25.65 433
   25.73 431
  

Поскольку файл калибровки имеет переменную длину, а необработанные файлы никогда не имеют идеально совпадающей временной метки, я использовал цикл for для фильтрации по набору необработанных данных, применения наклона и перехвата подгонки и создания нового столбца в исходном фрейме необработанных данных с откалиброванными значениями.

Вот что у меня есть на данный момент

 mylist <- list()

for (i in 1:length(cal)) {

  if (raw$time > cal[i,1] amp; raw$time < cal[(i 1),1]) {

  initial_t = cal[i,1]
  final_t = cal[(i 1),1]
  initial_b = cal[i,3]
  final_b = cal[(i 1),3]
  initial_m = cal[i,2]
  final_m = cal[(i 1),2]
  initial_p = cal[i,4]
  final_p = cal[(i 1), 4]

  b_factor = (final_b - initial_b)/(final_t - initial_t)
  m_factor = (final_m - initial_m)/(final_t - initial_t)
  p_factor = (final_p - initial_p)/(final_t - initial_t)

  vec <- raw %>%
      filter(raw, between(raw$time, initial_t, final_t)

  cal_m <- initial_m   m_factor*(vec$time - initial_t)
  cal_b <- initial_b   b_factor*(vec$time - initial_t)
  cal_p <- initial_p   p_factor*(vec$time - initial_t)

  new_value <- ((cal_m * vec$CO2)   cal_b)*(cal_p/101.325)

  vec$new_value <- new_value

  mylist[[i]] <- vec

    }
}

mylist <- as.data.frame(do.call("rbind", mylist))'
  

И я получаю сообщение об ошибке «условие имеет длину > 1 и будет использоваться только первый элемент»

Есть какие-либо подсказки или предложения о том, как отсортировать один фрейм данных, чтобы соответствовать временному интервалу в другом?

Комментарии:

1. cal$time это вектор, а не фрейм данных, поэтому вы должны использовать cal$time[i] , а не cal$time[i,1] .

2. Это предупреждение, а не ошибка, но обычно это означает, что кто-то сделал что-то неправильно. Обычно вам требуется логическое значение (логическое по длине один) в операторе if, но здесь вы предоставляете вектор (необработанный $ time не имеет длины 1), поэтому вы можете захотеть посмотреть на функцию ifelse . Если вы приведете воспроизводимый пример, включающий ожидаемый результат, вы обычно получите ответ более высокого качества.

3. @Moody_Mudskipper спасибо, я отредактировал свой пост, чтобы предоставить ссылку на файлы, с которыми я работаю