我有一个包含大量时间序列的数据帧:
1 0:03 B 1
2 0:05 A 1
3 0:05 A 1
4 0:05 B 1
5 0:10 A 1
6 0:10 B 1
7 0:14 B 1
8 0:18 A 1
9 0:20 A 1
10 0:23 B 1
11 0:30 A 1
我想将时间序列分成每6分钟一组,并计算A和B的频率:
1 0:06 A 2
2 0:06 B 2
3 0:12 A 1
4 0:12 B 1
5 0:18 A 1
6 0:24 A 1
7 0:24 B 1
8 0:18 A 1
9 0:30 A 1
此外,时间序列的类是字符。我该怎么办?
发布于 2019-06-05 06:06:33
这里有一种将时间转换为POSIXct
的方法,按6分钟间隔cut
时间,然后count
。
首先,您需要指定数据的年、月、日、小时、分钟和秒。这将有助于将其扩展到更大的数据集。
library(tidyverse)
library(lubridate)
# sample data
d <- data.frame(t = paste0("2019-06-02 ",
c("0:03","0:06","0:09","0:12","0:15",
"0:18","0:21","0:24","0:27","0:30"),
":00"),
g = c("A","A","B","B","B"))
d$t <- ymd_hms(d$t) # convert to POSIXct with `lubridate::ymd_hms()`
如果您检查新日期列的class
,您将看到它是"POSIXct“。
> class(d$t)
[1] "POSIXct" "POSIXt"
现在数据在"POSIXct“中,您可以按分钟间隔对其执行cut
操作!我们将添加这个新的分组因子作为一个名为tc
的新列。
d$tc <- cut(d$t, breaks = "6 min")
d
t g tc
1 2019-06-02 00:03:00 A 2019-06-02 00:03:00
2 2019-06-02 00:06:00 A 2019-06-02 00:03:00
3 2019-06-02 00:09:00 B 2019-06-02 00:09:00
4 2019-06-02 00:12:00 B 2019-06-02 00:09:00
5 2019-06-02 00:15:00 B 2019-06-02 00:15:00
6 2019-06-02 00:18:00 A 2019-06-02 00:15:00
7 2019-06-02 00:21:00 A 2019-06-02 00:21:00
8 2019-06-02 00:24:00 B 2019-06-02 00:21:00
9 2019-06-02 00:27:00 B 2019-06-02 00:27:00
10 2019-06-02 00:30:00 B 2019-06-02 00:27:00
现在,您可以对这个新间隔(tc
)和您的分组列(g
)进行group_by
,并计算出现的频率。获取组中观察的频率是一个相当常见的操作,因此dplyr
为此提供了count
:
count(d, g, tc)
# A tibble: 7 x 3
g tc n
<fct> <fct> <int>
1 A 2019-06-02 00:03:00 2
2 A 2019-06-02 00:15:00 1
3 A 2019-06-02 00:21:00 1
4 B 2019-06-02 00:09:00 2
5 B 2019-06-02 00:15:00 1
6 B 2019-06-02 00:21:00 1
7 B 2019-06-02 00:27:00 2
如果您在控制台中运行?dplyr::count()
,您将看到count(d, tc)
只是group_by(d, g, tc) %>% summarise(n = n())
的一个包装器。
https://stackoverflow.com/questions/56451761
复制相似问题