【问题标题】:Converting a base R loop into R data.table将基本 R 循环转换为 R data.table
【发布时间】:2016-05-05 14:59:50
【问题描述】:

我有一个数据框,其中包含每 15 分钟值的记录。

我正在使用循环来计算 15 分钟范围内的记录数。 但它非常慢。我觉得将其转换为 data.table 功能将大大加快该过程。

我写了以下循环:

Input$Freq  <-  array()

for(i in 1:nrow(Input))
{
  Input[i,"Freq"]<-0
}

for(i in 1:nrow(Input))
{
  for(j in 1:nrow(Input))
  {
    if(Input[i,"Cur_DateTime"]  > Input[j,"Cur_DateTime"] & Input[i,"Cur_DateTime"] < Input[j,"Window_15"])
      Input[i,"Freq"] <- Input[i,"Freq"]+1
  }
}

【问题讨论】:

  • 您可以发布您拥有的示例数据吗?这将有助于提供有效代码的答案。
  • 您可以清楚地立即丢弃第一个循环和初始array 分配。将它们替换为以下内容:Input[,"Freq"] &lt;- 0.

标签: r loops data.table


【解决方案1】:

我不确定这是否能准确回答您的问题。可以使用 base R 的 cut 命令直接对数据进行分箱。 这是一个例子:

#create a dummy sequence
s<-seq(from =as.POSIXct("2015-02-15 09:46:43.17"), by="5 min", length.out = 50)
df<-data.frame(s)

#bin the sequence by 15 minute intervals:
df$bins<-cut(df$s, "15 min")

使用dplyr库总结:

library(dplyr)
summarise(group_by(df,bins), n())

或者按照弗兰克的建议:

count(df, bins)

【讨论】:

  • Dplyr 有 counttally 来简化您的摘要编码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
  • 2021-06-25
  • 2011-03-25
相关资源
最近更新 更多