如何在一个数据框内迭代搜索介于另一个数据框的值之间的值?

时间:2019-03-05 21:33:39

标签: r loops dataframe for-loop iteration

我有两个数据文件,一个原始数据集和一个校准文件。我想做的是找到第一次和第二次校准运行之间的时间,并将其与原始文件中的时间块匹配,以便使用线性回归(已知的斜率和截距)对数据进行质量控制。

我一直在处理for循环,我知道它在R语言中并不理想,但是我现在看不到其他方法。

Here is an example of the files

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

还有原始数据的示例

> 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] & 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,并且只会使用第一个元素”

关于如何对一个数据帧进行排序以匹配另一窗口的时间窗口的任何提示或建议?

0 个答案:

没有答案