r - 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"))
解决方案
推荐阅读
- unity3d - 画布在设备上的 Unity 场景后渲染
- permissions - 如何将 Office 365 SHAREPOINT ONLINE 权限添加到 Microsoft 应用程序?
- sed - 用列表中的 sed 替换子目录中的文件条目
- javascript - 如何使用枚举中的值对数组进行排序?
- elasticsearch - 没有使用 Olivere Golang 将数据插入 ElasticSearch
- r - 应用两个元素的函数
- r - R中循环的优化
- sql-server - 如何将结果从 int SQL Server 转换为字符串
- java - 使用测试容器时“未找到可链接容器”
- angular - Angular 5 访问由 Angular 5 打开的窗口打开的外部窗口对象 url