R 以5分钟的间隔聚合列值并创建新的数据帧

R 以5分钟的间隔聚合列值并创建新的数据帧,r,dataframe,aggregate,R,Dataframe,Aggregate,我有一个数据帧: T1 T2 T3 timestamp 45.37 44.48 13 2015-11-05 10:23:00 44.94 44.55 13.37 2015-11-05 10:24:00 45.32 44.44 13.09 2015-11-0

我有一个数据帧:

           T1            T2           T3             timestamp
          45.37        44.48            13 2015-11-05 10:23:00
          44.94        44.55         13.37 2015-11-05 10:24:00
          45.32        44.44         13.09 2015-11-05 10:27:00
          45.46        44.51         13.29 2015-11-05 10:28:00
          45.46        44.65         13.18 2015-11-05 10:29:16
          45.96        44.85         13.23 2015-11-05 10:32:00
          45.52        44.56         13.53 2015-11-05 10:36:00
          45.36        44.62         13.25 2015-11-05 10:37:00
我想创建一个新的数据帧,其中包含基于
timestamp
列在5分钟间隔内聚合的T1、T2和T3变量。我确实遇到了
aggregate
,它似乎使用其中一列对其他列中的相应值进行分组/聚合

如果没有行的值超过5分钟的间隔,则表示
NA
s的行。我还喜欢另一列,它指示用于在5分钟间隔内进行平均的项目数

df1_xts <- as.xts(df1[, -4], order.by = df1$timestamp)
df1_xts_summed <- period.apply(df1_xts, ep, colSums)
df1_xts_summed$nrows <- period.apply(df1_xts$T1, endpoints(df1_xts, on = "minutes", k = 5), nrow)
df_final <- data.frame(timestamp = index(df1_xts_summed), coredata(df1_xts_summed))
df_final

            timestamp     T1     T2    T3 nrows
1 2015-11-05 10:27:00  90.31  89.03 26.37     2
2 2015-11-05 10:32:00 136.24 133.60 39.56     3
3 2015-11-05 10:37:00  45.96  44.85 13.23     1
4 2015-11-05 10:42:00  90.88  89.18 26.78     2

R
中寻找最有效的方法。谢谢

首先确保时间戳列是date.time列。如果该行已采用此格式,则可以跳过该行

df1$timestamp <- as.POSIXct(df1$timestamp)
如果您希望将所有内容都返回到data.frame中:

df_final <- data.frame(timestamp = index(df1_xts_summed), coredata(df1_xts_summed))
df_final

            timestamp     T1     T2    T3 nrows
1 2015-11-05 10:24:00  90.31  89.03 26.37     2
2 2015-11-05 10:29:16 136.24 133.60 39.56     3
3 2015-11-05 10:32:00  45.96  44.85 13.23     1
4 2015-11-05 10:37:00  90.88  89.18 26.78     2
接下来是与前面相同的xts代码,返回相同的数据,但时间戳现在是5分钟间隔的最后一个值

df1_xts <- as.xts(df1[, -4], order.by = df1$timestamp)
df1_xts_summed <- period.apply(df1_xts, ep, colSums)
df1_xts_summed$nrows <- period.apply(df1_xts$T1, endpoints(df1_xts, on = "minutes", k = 5), nrow)
df_final <- data.frame(timestamp = index(df1_xts_summed), coredata(df1_xts_summed))
df_final

            timestamp     T1     T2    T3 nrows
1 2015-11-05 10:27:00  90.31  89.03 26.37     2
2 2015-11-05 10:32:00 136.24 133.60 39.56     3
3 2015-11-05 10:37:00  45.96  44.85 13.23     1
4 2015-11-05 10:42:00  90.88  89.18 26.78     2

df1\u xts请提供数据集(可能使用dput),并为您的答案提供所需的输出。我希望每五分钟有一个值。答案中的输出在10:29:16有第二个值,在10:32:00有第三个值。我期望下一个值在10:34:00或更晚。基本上,我要做的是以5分钟的间隔将不等间隔的时间序列转换为等间隔的时间序列。Period.apply返回间隔中已知的最后一个值。10:32是10:31和10:35之间5分钟间隔内的最后一个可用值。但是,如果您想在5分钟的时间间隔内返回所有内容,那么确实应该指定预期的输出。有楼层功能,但它们将所有内容向下舍入到最近的指定周期。例如,如果5分钟,您的数据将在10:20开始,而不是10:23。这可能不是您想要的。我添加了代码以返回5分钟间隔的最后日期时间。#phiver,我很感谢您的回答,但我想知道您是否可以想出一种不需要xts文件的解决方案。我使用xts的问题是,我的字符数据(特别是股票代码)似乎妨碍了xts文件的使用(这有点讽刺,因为我认为xts文件经常用于投资情况)。有什么想法吗?@WBAKER,你可以试试带有
tq\u transmute
功能的tidyquant软件包。xts通常用于列表对象和lapply,以便一次性处理多个ticker。有多个SO答案可以告诉您如何使用。如果您需要进一步的帮助,请创建一个带有示例和预期输出的SO问题。
df1_xts <- as.xts(df1[, -4], order.by = df1$timestamp)
df1_xts_summed <- period.apply(df1_xts, ep, colSums)
df1_xts_summed$nrows <- period.apply(df1_xts$T1, endpoints(df1_xts, on = "minutes", k = 5), nrow)
df_final <- data.frame(timestamp = index(df1_xts_summed), coredata(df1_xts_summed))
df_final

            timestamp     T1     T2    T3 nrows
1 2015-11-05 10:27:00  90.31  89.03 26.37     2
2 2015-11-05 10:32:00 136.24 133.60 39.56     3
3 2015-11-05 10:37:00  45.96  44.85 13.23     1
4 2015-11-05 10:42:00  90.88  89.18 26.78     2
df1 <- structure(list(T1 = c(45.37, 44.94, 45.32, 45.46, 45.46, 45.96, 
45.52, 45.36), T2 = c(44.48, 44.55, 44.44, 44.51, 44.65, 44.85, 
44.56, 44.62), T3 = c(13, 13.37, 13.09, 13.29, 13.18, 13.23, 
13.53, 13.25), timestamp = c("2015-11-05 10:23:00", "2015-11-05 10:24:00", 
"2015-11-05 10:27:00", "2015-11-05 10:28:00", "2015-11-05 10:29:16", 
"2015-11-05 10:32:00", "2015-11-05 10:36:00", "2015-11-05 10:37:00"
)), class = "data.frame", row.names = c(NA, -8L))