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))