R在数据帧中找到属于给定阈值的第一个值

时间:2018-04-03 11:49:29

标签: r subset threshold

我是一个相当新的用户,我需要你帮助完成我坚持的任务。如果我的问题已被提出/回答,我将不胜感激,如果你能引导我进入相关页面。

我有以下数据集(lbnp_br),即随时间测量的光密度(OD)(以秒为单位):

 time   OD
1891    -244.6
1891.5  -244.4
1892    -242
1892.5  -242
1893    -241.1
1893.5  -242.4
1894    -245.2
1894.5  -249.6
**1895  -253.9**
1895.5  -254.5
1896    -251.9
1896.5  -246.7
1897    -242.4
1897.5  -234.6
1898    -225.5

我需要通过测量达到光密度阈值所需的时间来了解研究设备的响应能力。

为此,我计算了OD的变异系数(CV),我使用平均OD(-252.9098)+/- 2 * CV来定义响应阈值。对于上述数据,阈值设定为(平均OD + 2 * CV = -252.9917),和(平均OD-2 * CV = -252.8278)。

我现在需要计算从开始(1891秒)到超过+/-阈值的第一个OD值的时间(以秒为单位)。例如,对于上述数据帧,在1895秒处超过该阈值,对应于OD为-253.9。

我现在必须为每个研究对象和总共17个科目重复这3次,因此,我正在寻找一个我可以定义数据框和阈值的函数,它将返回第一个OD值,它在那里超过定义的阈值(all_threshold $ sup_2_minus)和(all_threshold $ sup_2_plus)及其相应的时间。

我尝试了subset在其他地方建议:

subset(lbnp_br, lbnp_br$OD < all_threshold$sup_2_minus & lbnp_br$OD > all_threshold$sup_2_plus)  

然而,这并没有回归我想要的东西。

以及

ifelse(lbnp_br$OD > all_threshold$sup_2_plus & lbnp_br$OD < all_threshold$sup_2_minus, lbnp_br$OD, NA)

返回NA并且未指定OD的准确值和时间。

3 个答案:

答案 0 :(得分:0)

这不是一个简短的答案,但希望清楚。它使用dplyr包:

library(dplyr)

find_time = function(df, threshold){
  return_value = df %>%
    arrange(time) %>%
    filter(OD < threshold) %>%
    slice(1)
  return(return_value)
}

find_time(data, threshold)

这将根据时间对您的数据进行排序(排列),对OD值低于阈值的数据进行子集(过滤),取第一个值(切片),然后返回。

答案 1 :(得分:0)

一个班轮:

function (dfr, threshold) dfr$OD[ min(which(dfr$OD > threshold)) ]

如果数据框中没有这样的行,则会发出警告并NA,这可能是您想要的。

另一种基于purrr的解决方案:

function (dfr, threshold) purrr::detect(dfr$OD, ~ .x > threshold)

如果找不到任何内容则返回NULL,我猜是更正确。

答案 2 :(得分:0)

使用上面的代码,我添加了一些额外的条件来获得我正在寻找的内容,这里适用于任何可能需要类似内容的人:

find_time <- function(df, df2, df3, threshold_1, threshold_2, threshold_3, threshold_4, threshold_5, threshold_6){
  return_value_1 = df %>%
    arrange(time) %>%
    filter(OD > threshold_1) %>%
    slice_(1)
  colnames(return_value_1)[1] <- "time_hdt_upper"
  colnames(return_value_1)[2] <- "OD_hdt_upper"

  if (nrow(return_value_1) == 0) {
    return_value_1[1,1] <- NA
    return_value_1[1,2] <- NA
  }


  return_value_2 = df %>%
    arrange(time) %>%
    filter(OD < threshold_2) %>%
    slice_(1)
  colnames(return_value_2)[1] <- "time_hdt_lower"
  colnames(return_value_2)[2] <- "OD_hdt_lower"

  if (nrow(return_value_2) == 0) {
    return_value_2[1,1] <- NA
    return_value_2[1,2] <- NA
  }

  return_value_3 = df2 %>%
    arrange(time) %>%
    filter(OD > threshold_3) %>%
    slice_(1)
  colnames(return_value_3)[1] <- "time_lbnp_upper"
  colnames(return_value_3)[2] <- "OD_lbnp_upper"

  if (nrow(return_value_3) == 0) {
    return_value_3[1,1] <- NA
    return_value_3[1,2] <- NA
  }


  return_value_4 = df2 %>%
    arrange(time) %>%
    filter(OD < threshold_4) %>%
    slice_(1)
  colnames(return_value_4)[1] <- "time_lbnp_lower"
  colnames(return_value_4)[2] <- "OD_lbnp_lower"

  if (nrow(return_value_4) == 0) {
    return_value_4[1,1] <- NA
    return_value_4[1,2] <- NA
  }



  return_value_5 = df3 %>%
    arrange(time) %>%
    filter(OD > threshold_5) %>%
    slice_(1)
  colnames(return_value_5)[1] <- "time_hut_upper"
  colnames(return_value_5)[2] <- "OD_hut_upper"

  if (nrow(return_value_5) == 0) {
    return_value_5[1,1] <- NA
    return_value_5[1,2] <- NA
  }



  return_value_6 = df3 %>%
    arrange(time) %>%
    filter(OD < threshold_6) %>%
    slice_(1)
  colnames(return_value_6)[1] <- "time_hut_lower"
  colnames(return_value_6)[2] <- "OD_hut_lower"

  if (nrow(return_value_6) == 0) {
    return_value_6[1,1] <- NA
    return_value_6[1,2] <- NA
  }



  return(data.frame(return_value_1, return_value_2, return_value_3, return_value_4, return_value_5, return_value_6))


}

给出

find_time_threshold <- find_time(hdt_br, lbnp_br, hut_br, all_threshold$base_plus, all_threshold$base_minus, all_threshold$sup_2_plus, all_threshold$sup_2_minus, all_threshold$sup_3_plus, all_threshold$sup_3_minus)
> find_time_threshold

  time_hdt_upper OD_hdt_upper time_hdt_lower OD_hdt_lower time_lbnp_upper OD_lbnp_upper time_lbnp_lower
1          596.5        123.3            506         91.3              NA            NA            1706
  OD_lbnp_lower time_hut_upper OD_hut_upper time_hut_lower OD_hut_lower
1        -27.89         3186.5       -82.98           2909       -211.7