首页 > 解决方案 > R 函数/循环:当数值变量低于某个值(例如 40)时,需要多长时间才能回到 40 以上?

问题描述

我试图在 R 中创建一个可重现/自动化的函数来捕获特定数值变量的“恢复率”。这个变量“SNR_kHz”在 -17 和 77 kHz 之间变化,但也有一个分类相关的变量,称为“SNRLevel”,具有我创建的“低 SNR”、“平均 SNR”和“高 SNR”级别。“低 SNR”与低于 40 的“SNR_kHz”值相同。我的数据是数字、日期时间和分类数据的混合体,由于数据是如何固有地收集和连接的,因此我的数据包含很多约 3000 个观察值,只有约 300 个观察值对齐。我已经尽可能地对数据进行了分类,并在适当的地方删除了 NA。一个重要的注意事项是,有两个麦克风通​​道告诉我 SNR_kHz 是什么(“F.SNRChannel”1 和 2),这两个通道将始终具有不同的 kHz 录音。通道 1 显示了最低的 kHz 值,而通道 2 似乎更稳定。如果可能的话,我想将这两个通道视为一个单独的实体,因为它们在物理上彼此相邻,并且大多数差异可能是由于故障而不是实际不同的 kHz 录音。例如,如果“F.SNRChannel 1”低于 40 kHz,即使“F.SNRChannel 2”的 kHz 值约为 70,我也希望循环开始。下面是我的数据集“示例”的图像,位于底部这篇文章是我的数据集前 30 行的 dput() 输出。并且这两个通道将始终具有不同的 kHz 录音。通道 1 显示了最低的 kHz 值,而通道 2 似乎更稳定。如果可能的话,我想将这两个通道视为一个单独的实体,因为它们在物理上彼此相邻,并且大多数差异可能是由于故障而不是实际不同的 kHz 录音。例如,如果“F.SNRChannel 1”低于 40 kHz,即使“F.SNRChannel 2”的 kHz 值约为 70,我也希望循环开始。下面是我的数据集“示例”的图像,位于底部这篇文章是我的数据集前 30 行的 dput() 输出。并且这两个通道将始终具有不同的 kHz 录音。通道 1 显示了最低的 kHz 值,而通道 2 似乎更稳定。如果可能的话,我想将这两个通道视为一个单独的实体,因为它们在物理上彼此相邻,并且大多数差异可能是由于故障而不是实际不同的 kHz 录音。例如,如果“F.SNRChannel 1”低于 40 kHz,即使“F.SNRChannel 2”的 kHz 值约为 70,我也希望循环开始。下面是我的数据集“示例”的图像,位于底部这篇文章是我的数据集前 30 行的 dput() 输出。如果可能的话,我想将这两个通道视为一个单独的实体,因为它们在物理上彼此相邻,并且大多数差异可能是由于故障而不是实际不同的 kHz 录音。例如,如果“F.SNRChannel 1”低于 40 kHz,即使“F.SNRChannel 2”的 kHz 值约为 70,我也希望循环开始。下面是我的数据集“示例”的图像,位于底部这篇文章是我的数据集前 30 行的 dput() 输出。如果可能的话,我想将这两个通道视为一个单独的实体,因为它们在物理上彼此相邻,并且大多数差异可能是由于故障而不是实际不同的 kHz 录音。例如,如果“F.SNRChannel 1”低于 40 kHz,即使“F.SNRChannel 2”的 kHz 值约为 70,我也希望循环开始。下面是我的数据集“示例”的图像,位于底部这篇文章是我的数据集前 30 行的 dput() 输出。

这是数据集及其标题的图像

当 SNR-kHz 降至 40kHz 以下时,我想获取相对湿度和温度(“Humidmean”和“Tempmean”列)和日期时间(“binned”列)。我的日期时间列的格式为“2020-08-01 00:06:00”。当 SNR_kHz 回到 40 以上时,我想“打破”循环,并再次记下日期时间、湿度和温度。通常,当 SNR_khz 低于 40 时,需要数小时甚至数天才能再次恢复到 40 以上。我试图找出进行此恢复所需的平均“时间”,同时还要了解恢复发生时的相对湿度和温度。

我玩过函数“for”、“repeat”、“while”、“print”、“for”、“break”,并在循环内创建新变量,以了解 SNR 值低于 40 时的日期时间(例如“开始”)以及当 SNR 值再次高于 40 时的日期时间(例如“结束”)使用“difftime(结束开始)”作为循环内的函数无济于事。这是一个例子我尝试过的代码:

repeat{
  
    if(example$SNRLevel=="Low SNR")
      start<-print(example$binned)
      print(example$Humidmean)
    
    if(example$SNRLevel!="Low SNR")
      {
      break
      end<-print(example$binned)
      }
      print(difftime(start-end, tz="America/Chicago", units="hours"))
  }

这是我的数据集的 dput() 输出:

>dput(example[495:535, ])
structure(list(binned = structure(c(1597578360, 1597578360, 1597579560, 
1597622760, 1597623960, 1597623960, 1597625160, 1597626360, 1597627560, 
1597628760, 1597629960, 1597631160, 1597632360, 1597633560, 1597634760, 
1597635960, 1597637160, 1597638360, 1597639560, 1597640760, 1597641960, 
1597643160, 1597644360, 1597645560, 1597646760, 1597647960, 1597649160, 
1597650360, 1597651560, 1597652760, 1597653960, 1597655160, 1597656360, 
1597657560, 1597658760, 1597659960, 1597661160, 1597662360, 1597663560, 
1597664760, 1597664760), tzone = "America/Chicago", class = c("POSIXct", 
"POSIXt")), precipsum = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0), Humidmean = c(64.3, 64.3, 66, 48.8, 
53.1, 53.1, 54.05, 51.4, 55.1, 59.85, 59.6, 57.7, 56.85, 58.8, 
59, 59.2, 57.8, 59.1, 59.45, 62.2, 63.5, 65, 66, 67.6, 67.75, 
70.2, 70.9, 71.8, 74.6, 74.1, 76.5, 74.1, 77, 76.3, 78.3, 81.7, 
90.95, 100, 100, 100, 100), Pressmean = c(980.35, 980.35, 980.5, 
978.6, 978.7, 978.7, 978.6, 978.7, 978.5, 978.6, 978.6, 978.7, 
978.55, 978.6, 978.7, 978.55, 978.6, 978.7, 978.85, 978.8, 979, 
979.2, 979, 979, 979.2, 979.2, 979.1, 979.05, 979.2, 979.2, 978.75, 
978.5, 978.4, 978.15, 978.1, 977.9, 977.7, 977.8, 977.6, 977.95, 
977.95), Tempmean = c(21.6, 21.6, 21.6, 28.5, 27.9, 27.9, 27.5, 
27.5, 27.3, 26.75, 26.5, 26.4, 26.35, 26, 25.7, 25.45, 25.8, 
24.9, 24.7, 24.4, 24.3, 23.9, 23.6, 23.3, 23.3, 23.1, 23, 22.85, 
22.3, 22.5, 21.9, 22.2, 21.7, 22.05, 22, 21.3, 20.45, 19.7, 19.3, 
19.05, 19.05), F.SNRChannel = structure(c(1L, 2L, NA, NA, 1L, 
2L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, 1L, 2L), .Label = c("Channel 1", "Channel 2"), class = "factor"), 
    SNR_40kHz = c(2, 65, NA, NA, 0, 65, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 73, 63), 
    HumidLevel = c("Avg Humid", "Avg Humid", "Avg Humid", "Low Humid", 
    "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid", 
    "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid", 
    "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid", 
    "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid", 
    "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid", 
    "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid", "Avg Humid", 
    "Avg Humid", "High Humid", "High Humid", "High Humid", "High Humid", 
    "High Humid", "High Humid"), SNRLevel = c("Low SNR", "Avg SNR", 
    NA, NA, "Low SNR", "Avg SNR", NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "High SNR", "Avg SNR"
    ), RainPresence = c("No rain", "No rain", "No rain", "No rain", 
    "No rain", "No rain", "No rain", "No rain", "No rain", "No rain", 
    "No rain", "No rain", "No rain", "No rain", "No rain", "No rain", 
    "No rain", "No rain", "No rain", "No rain", "No rain", "No rain", 
    "No rain", "No rain", "No rain", "No rain", "No rain", "No rain", 
    "No rain", "No rain", "No rain", "No rain", "No rain", "No rain", 
    "No rain", "No rain", "No rain", "No rain", "No rain", "No rain", 
    "No rain")), row.names = c(NA, -41L), groups = structure(list(
    binned = structure(c(1597578360, 1597579560, 1597622760, 
    1597623960, 1597625160, 1597626360, 1597627560, 1597628760, 
    1597629960, 1597631160, 1597632360, 1597633560, 1597634760, 
    1597635960, 1597637160, 1597638360, 1597639560, 1597640760, 
    1597641960, 1597643160, 1597644360, 1597645560, 1597646760, 
    1597647960, 1597649160, 1597650360, 1597651560, 1597652760, 
    1597653960, 1597655160, 1597656360, 1597657560, 1597658760, 
    1597659960, 1597661160, 1597662360, 1597663560, 1597664760
    ), tzone = "America/Chicago", class = c("POSIXct", "POSIXt"
    )), .rows = structure(list(1:2, 3L, 4L, 5:6, 7L, 8L, 9L, 
        10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 
        21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 
        32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40:41), ptype = integer(0), class = c("vctrs_list_of", 
    "vctrs_vctr", "list"))), row.names = c(NA, -38L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"))

标签: r

解决方案


推荐阅读