通过聚合相应的值将毫秒数据转换为每日数据
Convert milliseconds data to daily data by aggregating corresponding values
我需要聚合从毫秒到每天的时间戳数据..
示例数据:
System_ID n_iter value Timestamp
1 xXXXXXXXxx 1 511 2010-05-01 03:29:37.21
2 xXXXXXXXxx 2 513 2010-05-01 03:52:07.56
3 xXXXXXXXxx 3 234 2010-05-01 05:13:54.24
4 xXXXXXXXxx 4 112 2010-05-01 05:41:37.42
5 xXXXXXXXxx 5 173 2010-05-01 06:53:19.01
6 xXXXXXXXxx 6 112 2010-05-01 07:02:53.62
7 xXXXXXXXxx 7 232 2010-05-01 07:35:33.86
8 xXXXXXXXxx 8 776 2010-05-01 07:50:08.14
9 xXXXXXXXxx 9 887 2010-05-01 08:32:55.5
10 xXXXXXXXxx 10 332 2010-05-01 08:56:44.96
11 xXXXXXXXxx 11 778 2010-05-01 09:17:22.57
12 xXXXXXXXxx 12 998 2010-05-01 10:16:26.57
13 xXXXXXXXxx 13 300 2010-05-02 03:33:40.4
14 xXXXXXXXxx 14 400 2010-05-02 03:58:26.44
15 xXXXXXXXxx 15 400 2010-05-02 04:00:23.98
我需要聚合 R 中以毫秒为单位到每天的数据。输出应如下所示:
System_ID n_iter value Timestamp
xxxxxxxx 12 471.5 (Avg) 2010-05-01
我假设您至少可以将时间戳列作为字符读取到 R data.frame(取决于您读取数据的方式,可能会做得更好)。
在这样的设置中,您可以使用 dplyr 包获得示例输出。
df <- data.frame(
System_ID = rep('xXXXXXXXxx', 15)
, n_iter = seq(1,15)
, value = c(511, 513, 234, 112, 173, 112, 232, 778, 887, 332, 778, 998, 300, 400, 400)
, Timestamp = c('2010-05-01 03:29:37.21', '2010-05-01 03:52:07.56', '2010-05-01 05:13:54.24', '2010-05-01 05:41:37.42', '2010-05-01 06:53:19.01', '2010-05-01 07:02:53.62', '2010-05-01 07:35:33.86', '2010-05-01 07:50:08.14', '2010-05-01 08:32:55.5', '2010-05-01 08:56:44.96', '2010-05-01 09:17:22.57', '2010-05-01 10:16:26.57', '2010-05-02 03:33:40.4', '2010-05-02 03:58:26.44', '2010-05-02 04:00:23.98')
)
df %>%
dplyr::mutate(
Timestamp = as.Date(strptime(Timestamp, format = '%Y-%m-%d %H:%M:%OS'))
) %>%
dplyr::group_by(System_ID, Timestamp) %>%
dplyr::summarise(
n_iter = max(n_iter)
, value = mean(value)
) %>%
dplyr::ungroup()
这是一个解决方案:
首先将Timestamp
转换为POSIXct
格式(此处不需要),并创建一个day
列。
# convert Timestamp to POSIXct
df$Timestamp <- as.POSIXct(df$Timestamp, format = "%Y-%m-%d %H:%M:%OS")
# create a "day" column
df$day <- format(df$Timestamp, "%Y-%m-%d")
然后,我们使用vapply
循环检索每日聚合(这里存在许多其他可能性)
# retrieve the required daily data
t(vapply(seq_along(unique(df$day)),
function (k) c(unique(df$System_ID[df$day == unique(df$day)[k]]),
max(df$n_iter[df$day == unique(df$day)[k]]),
mean(df$value[df$day == unique(df$day)[k]]),
unique(df$day)[k]),
character(4)))
终于,结果出来了
[,1] [,2] [,3] [,4]
[1,] "xXXXXXXXxx" "12" "471.666666666667" "2010-05-01"
[2,] "xXXXXXXXxx" "15" "366.666666666667" "2010-05-02"
请注意,它 returns 一个 character
矩阵作为 vapply
returns 向量中的函数(即必须是一个 class
)。要将结果的第 2 列和第 3 列设为 numeric
,可以应用 as.numeric
或修改 vapply
.
中的函数
当然,以上假设:
- 只有一个
System_ID
(至少每天)和
- 所需的
n_iter
值是其每日 max
。
所以请记住这一点,因为 vapply
可能下注非常有效和方便,但它也可能是严格的。
我需要聚合从毫秒到每天的时间戳数据..
示例数据:
System_ID n_iter value Timestamp
1 xXXXXXXXxx 1 511 2010-05-01 03:29:37.21
2 xXXXXXXXxx 2 513 2010-05-01 03:52:07.56
3 xXXXXXXXxx 3 234 2010-05-01 05:13:54.24
4 xXXXXXXXxx 4 112 2010-05-01 05:41:37.42
5 xXXXXXXXxx 5 173 2010-05-01 06:53:19.01
6 xXXXXXXXxx 6 112 2010-05-01 07:02:53.62
7 xXXXXXXXxx 7 232 2010-05-01 07:35:33.86
8 xXXXXXXXxx 8 776 2010-05-01 07:50:08.14
9 xXXXXXXXxx 9 887 2010-05-01 08:32:55.5
10 xXXXXXXXxx 10 332 2010-05-01 08:56:44.96
11 xXXXXXXXxx 11 778 2010-05-01 09:17:22.57
12 xXXXXXXXxx 12 998 2010-05-01 10:16:26.57
13 xXXXXXXXxx 13 300 2010-05-02 03:33:40.4
14 xXXXXXXXxx 14 400 2010-05-02 03:58:26.44
15 xXXXXXXXxx 15 400 2010-05-02 04:00:23.98
我需要聚合 R 中以毫秒为单位到每天的数据。输出应如下所示:
System_ID n_iter value Timestamp
xxxxxxxx 12 471.5 (Avg) 2010-05-01
我假设您至少可以将时间戳列作为字符读取到 R data.frame(取决于您读取数据的方式,可能会做得更好)。 在这样的设置中,您可以使用 dplyr 包获得示例输出。
df <- data.frame(
System_ID = rep('xXXXXXXXxx', 15)
, n_iter = seq(1,15)
, value = c(511, 513, 234, 112, 173, 112, 232, 778, 887, 332, 778, 998, 300, 400, 400)
, Timestamp = c('2010-05-01 03:29:37.21', '2010-05-01 03:52:07.56', '2010-05-01 05:13:54.24', '2010-05-01 05:41:37.42', '2010-05-01 06:53:19.01', '2010-05-01 07:02:53.62', '2010-05-01 07:35:33.86', '2010-05-01 07:50:08.14', '2010-05-01 08:32:55.5', '2010-05-01 08:56:44.96', '2010-05-01 09:17:22.57', '2010-05-01 10:16:26.57', '2010-05-02 03:33:40.4', '2010-05-02 03:58:26.44', '2010-05-02 04:00:23.98')
)
df %>%
dplyr::mutate(
Timestamp = as.Date(strptime(Timestamp, format = '%Y-%m-%d %H:%M:%OS'))
) %>%
dplyr::group_by(System_ID, Timestamp) %>%
dplyr::summarise(
n_iter = max(n_iter)
, value = mean(value)
) %>%
dplyr::ungroup()
这是一个解决方案:
首先将
Timestamp
转换为POSIXct
格式(此处不需要),并创建一个day
列。# convert Timestamp to POSIXct df$Timestamp <- as.POSIXct(df$Timestamp, format = "%Y-%m-%d %H:%M:%OS") # create a "day" column df$day <- format(df$Timestamp, "%Y-%m-%d")
然后,我们使用
vapply
循环检索每日聚合(这里存在许多其他可能性)# retrieve the required daily data t(vapply(seq_along(unique(df$day)), function (k) c(unique(df$System_ID[df$day == unique(df$day)[k]]), max(df$n_iter[df$day == unique(df$day)[k]]), mean(df$value[df$day == unique(df$day)[k]]), unique(df$day)[k]), character(4)))
终于,结果出来了
[,1] [,2] [,3] [,4] [1,] "xXXXXXXXxx" "12" "471.666666666667" "2010-05-01" [2,] "xXXXXXXXxx" "15" "366.666666666667" "2010-05-02"
请注意,它 returns 一个 character
矩阵作为 vapply
returns 向量中的函数(即必须是一个 class
)。要将结果的第 2 列和第 3 列设为 numeric
,可以应用 as.numeric
或修改 vapply
.
当然,以上假设:
- 只有一个
System_ID
(至少每天)和 - 所需的
n_iter
值是其每日max
。
所以请记住这一点,因为 vapply
可能下注非常有效和方便,但它也可能是严格的。