是否有 R 函数以 15 秒的间隔过滤数据集?
is there an R function to filter a dataset in 15 secs interval?
我正在尝试过滤深度数据和相应日期的数据集。
时间列是 POSIXct format = "%Y%m%d%H%M%S"
。
这是我的数据的样子:
Depth Time
0.1 2018-06-24 01:26:40
0.2 2018-06-24 01:26:41
0.2 2018-06-24 01:26:56
0.1 2018-06-24 01:26:57
0.1 2018-06-24 01:26:58
0.1 2018-06-24 01:26:59
0.1 2018-06-24 01:27:14
0.1 2018-06-24 01:27:15
0.1 2018-06-24 01:27:16
0.1 2018-06-24 01:27:17
0.1 2018-06-24 01:27:30
我想创建一个包含相同数据但每 15 秒只有一个新条目的数据框。我的数据有时是连续的,有时记录的时间有间隙。
这将是我想要的输出:
深度时间
0.2 2018-06-24 01:26:41
0.2 2018-06-24 01:26:56
0.1 2018-06-24 01:27:14
0.1 2018-06-24 01:27:30
我尝试使用适用于连续数据集部分的行之间的时间差:
dt_filter <- d_cor %>%
mutate(diff = Time - lag(Time, default = first(Time)))
if ((dt_filter$diff < 2) ) {
dt_filter_1 <- dt_filter[seq(1, nrow(dt_filter), 15), ]
}
但是一旦我尝试添加不连续的那些,这就给我带来了问题:
dt_filter_15 <- dt_filter %>%
filter(diff >= 15 )
从那以后,我就不再总是有 15 秒的间隔了,显然这不算在内。
到目前为止,我找不到能够过滤我的时间列的函数。我是 R 的新手,所以不太熟悉编写我自己的循环,我想这是必要的......而且时间数据不会让它变得更容易。
感谢您的帮助!
编辑
@Ben 感谢您的快速回复!
这是我得到的一些输出:
Depth Time diff cumdiff x
0.1 2018-06-23 23:59:44 1 1030 0
0.0 2018-06-24 00:01:02 78 1035 5
0.0 2018-06-24 00:01:03 1 1036 1
最后两行之间只有 1s 的差异,但它仍然被添加到 cumdiff 中,因此计入 x 列
一个潜在的解决方案是 dplyr
- 尽管我确信可能有更好的选择,尤其是 data.table
。正如@42- 建议和@Maurits Evers 所展示的那样,您可以执行以下操作:
library(dplyr)
d_cor %>%
arrange(Time) %>%
mutate(
diff = abs(lag(Time) - Time),
diff = ifelse(is.na(diff), 0, diff),
cumdiff = cumsum(diff) %/% 15,
x = abs(lag(cumdiff) - cumdiff)) %>%
filter(is.na(x) | x > 0) %>%
select(Depth, Time)
Depth Time
1 0.1 2018-06-24 01:26:40
2 0.2 2018-06-24 01:26:56
3 0.1 2018-06-24 01:27:14
4 0.1 2018-06-24 01:27:30
diff
将包括连续行之间的时间差(以秒为单位)。第一行将是 NA
(更改为 0)。
cumdiff
是 diff
的累加和,但在模除以 15 之后(cumdiff
至少每 15 秒增加 1)。
过滤器将包括第一行 (x = NA
) 和 cumdiff
发生变化的其他行(至少经过 15 秒的行)。
其他可能有用的示例包括 data.table
:
Subset time series so that selected rows differs by a certain minimum time
编辑:此解决方案以固定的 15 秒 windows 查找时间。存在与大于 15 的差异相关的问题。对于这些情况,它不会 'reset' 并开始新的 15 秒 window。相反,它会包括那段时间,无论它处于第 15 秒 window。因此,我们可能会发现彼此接近的时间,尤其是之后。
感谢您的链接,我发现该功能似乎运行良好 - 以防万一有人有同样的问题:
issecsApart <- function(d_cor) {
secs <- 0
keeps <- c()
for (d in d_cor) {
if (d >= secs + 15) {
secs <- d
keeps <- c(keeps, TRUE)
} else {
keeps <- c(keeps, FALSE)
}
}
keeps
}
d_cor2 <- d_cor %>%
arrange(Time) %>%
filter(issecsApart(Time))
感谢您的帮助!
我正在尝试过滤深度数据和相应日期的数据集。
时间列是 POSIXct format = "%Y%m%d%H%M%S"
。
这是我的数据的样子:
Depth Time
0.1 2018-06-24 01:26:40
0.2 2018-06-24 01:26:41
0.2 2018-06-24 01:26:56
0.1 2018-06-24 01:26:57
0.1 2018-06-24 01:26:58
0.1 2018-06-24 01:26:59
0.1 2018-06-24 01:27:14
0.1 2018-06-24 01:27:15
0.1 2018-06-24 01:27:16
0.1 2018-06-24 01:27:17
0.1 2018-06-24 01:27:30
我想创建一个包含相同数据但每 15 秒只有一个新条目的数据框。我的数据有时是连续的,有时记录的时间有间隙。
这将是我想要的输出:
深度时间
0.2 2018-06-24 01:26:41
0.2 2018-06-24 01:26:56
0.1 2018-06-24 01:27:14
0.1 2018-06-24 01:27:30
我尝试使用适用于连续数据集部分的行之间的时间差:
dt_filter <- d_cor %>%
mutate(diff = Time - lag(Time, default = first(Time)))
if ((dt_filter$diff < 2) ) {
dt_filter_1 <- dt_filter[seq(1, nrow(dt_filter), 15), ]
}
但是一旦我尝试添加不连续的那些,这就给我带来了问题:
dt_filter_15 <- dt_filter %>%
filter(diff >= 15 )
从那以后,我就不再总是有 15 秒的间隔了,显然这不算在内。
到目前为止,我找不到能够过滤我的时间列的函数。我是 R 的新手,所以不太熟悉编写我自己的循环,我想这是必要的......而且时间数据不会让它变得更容易。
感谢您的帮助!
编辑
@Ben 感谢您的快速回复!
这是我得到的一些输出:
Depth Time diff cumdiff x
0.1 2018-06-23 23:59:44 1 1030 0
0.0 2018-06-24 00:01:02 78 1035 5
0.0 2018-06-24 00:01:03 1 1036 1
最后两行之间只有 1s 的差异,但它仍然被添加到 cumdiff 中,因此计入 x 列
一个潜在的解决方案是 dplyr
- 尽管我确信可能有更好的选择,尤其是 data.table
。正如@42- 建议和@Maurits Evers 所展示的那样,您可以执行以下操作:
library(dplyr)
d_cor %>%
arrange(Time) %>%
mutate(
diff = abs(lag(Time) - Time),
diff = ifelse(is.na(diff), 0, diff),
cumdiff = cumsum(diff) %/% 15,
x = abs(lag(cumdiff) - cumdiff)) %>%
filter(is.na(x) | x > 0) %>%
select(Depth, Time)
Depth Time
1 0.1 2018-06-24 01:26:40
2 0.2 2018-06-24 01:26:56
3 0.1 2018-06-24 01:27:14
4 0.1 2018-06-24 01:27:30
diff
将包括连续行之间的时间差(以秒为单位)。第一行将是 NA
(更改为 0)。
cumdiff
是 diff
的累加和,但在模除以 15 之后(cumdiff
至少每 15 秒增加 1)。
过滤器将包括第一行 (x = NA
) 和 cumdiff
发生变化的其他行(至少经过 15 秒的行)。
其他可能有用的示例包括 data.table
:
Subset time series so that selected rows differs by a certain minimum time
编辑:此解决方案以固定的 15 秒 windows 查找时间。存在与大于 15 的差异相关的问题。对于这些情况,它不会 'reset' 并开始新的 15 秒 window。相反,它会包括那段时间,无论它处于第 15 秒 window。因此,我们可能会发现彼此接近的时间,尤其是之后。
感谢您的链接,我发现该功能似乎运行良好 - 以防万一有人有同样的问题:
issecsApart <- function(d_cor) {
secs <- 0
keeps <- c()
for (d in d_cor) {
if (d >= secs + 15) {
secs <- d
keeps <- c(keeps, TRUE)
} else {
keeps <- c(keeps, FALSE)
}
}
keeps
}
d_cor2 <- d_cor %>%
arrange(Time) %>%
filter(issecsApart(Time))
感谢您的帮助!