0

我一直试图弄清楚这一点,但一直没能做到。我发现很多类似的问题根本没有帮助。

我在 R 的数据框中有大约 43000 条记录。日期列的格式为“2011-11-15 02:00:01”,另一列是计数。数据框的结构:

str(results)
'data.frame':   43070 obs. of  2 variables:
 $ dates: Factor w/ 43070 levels "2011-11-15 02:00:01",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ count: num  1 2 1 1 1 1 2 3 1 2 ...

如何获得每分钟的总计数?

而且我还想将results数据框转换为json。我使用rjson了将整个数据框转换为单个 json 元素的包。当我插入 mongodb 时,所有 43000 条记录都只有 _id 。我做错了什么?

4

2 回答 2

2

您可以使用该xts软件包很容易地获得计数/分钟。

install.packages("xts")
require("xts")
results_xts <- xts(results$count, order.by = as.POSIXlt(results$dates))

这会将您的数据框转换为 xts 对象。有一堆函数(apply.dailyapply.yearly等)xts将函数应用于不同的时间范围,但没有一个按分钟计算的。幸运的是,这些函数的代码非常简单,所以只需运行

ep <- endpoints(results_xts, "minutes")
period.apply(results_xts, ep, FUN = sum)

对不起,我不知道你的另一个问题的答案。

于 2014-10-09T00:33:04.133 回答
1

星号在这里,未经测试,但这是我获取每分钟计数的解决方案,也许有人会在 json 部分加入,我不熟悉

这是我的示例时间序列和计数

tseq<-seq(now,length.out=130, by="sec")
count<-rep(1, 130)

我们通过以下方式找到我们的分钟切换位置的索引

mins<-c(0,diff(floor(cumsum(c(0,diff(tseq)))/60)))
indxs<-which(mins%in%1)

让我分解一下(因为那里嵌套了很多东西)。

  1. 首先我们对时间序列进行 diff,然后在前面添加一个 0,因为我们失去了 diff 的观察结果
  2. 其次,对 diff 向量求和,得到每个点的秒值(这也可以通过对时间向量的简单格式调用来完成)
  3. 第三,将该向量(现在是每个点的秒数)除以 60,这样我们就得到了每个点对应于分钟的值。
  4. 第四,将它取底,这样我们就可以得到整数
  5. 区分那个向量,所以我们得到 0,除了 1 的分钟切换
  6. 将 0 添加到该向量,因为我们失去了 diff 的观察结果
  7. 然后使用 which 调用获取 1 的索引

然后我们找到我们分钟的开始和结束

startpoints<-indxs
endpoints<-c(indxs[2:length(indxs)], length(mins))

然后我们简单地对相应的子集求和

mapply(function(start, end) sum(count[start:end]), start=startpoints, end=endpoints)
#[1] 61 10

第一个点我们得到 61,因为我们包括第一个子集的第 0 秒和第 60 秒

于 2014-10-09T00:00:14.693 回答