如何重写r循环,将每15个观察值的平均值用于相同的代码,但没有循环



我正在处理一个庞大的数据集(能量使用的1分钟间隔观察年)。我想将其从1分钟的间隙转换为15分钟。

我已经写了一本成功完成此操作的循环(在数据的一小部分上进行了测试);但是,当我尝试在主要数据上运行它时,它的执行非常慢 - 这将花费我175个小时的时间来运行完整的循环(我执行中期将其停止)。

要转换为15分钟间隔的数据是kWh的使用;因此,将其转换仅需要采取第一个15观察的平均值,然后是第二个15,等等。这是有效的循环:

# Opening the file
data <- read.csv("1.csv",colClasses="character",na.strings="?")
# Adding an index to each row
total <- nrow(data)
data$obsnum <- seq.int(nrow(data))
# Calculating 15 min kwH usage
data$use_15_min <- data$use
for (i in 1:total) {
  int_used <- floor((i-1)/15)
  obsNum <- 15*int_used
  sum <- 0
  for (j in 1:15) {
    usedIndex <- as.numeric(obsNum+j)
    sum <- as.numeric(data$use[usedIndex]) + sum
  }
  data$use_15_min[i] <- sum/15
}

我一直在寻找可以执行相同操作的函数,但不使用循环,我想这应该节省很多时间。但是,我找不到一个。如何在不使用循环的情况下实现相同的功能?

尝试data.table:

library(data.table)
DT <- data.table(data)
n <- nrow(DT)
DT[, use_15_min := mean(use), by = gl(n, 15, n)]

注意

问题缺少输入数据,因此我们使用了以下内容:

data <- data.frame(use = 1:100)

一个潜在的解决方案是计算运行均值(例如使用ttr :: runmean),然后选择每15个观测值。这是一个示例:

df = data.frame(x = 1:100, y = runif(100))
df['runmean'] = TTR::runMean(df['y'], n=15)
df_15 = df[seq(1,nrow(df), 15), ]

我无法测试它,因为我没有您的数据,但也许:

total <- nrow(data)
data$use_15_min = TTR::runMean(data$use, n=15)
data_15_min = data[seq(1, nrow(df), 15)]

我将使用lubridate::floor_date创建15分钟的分组。

library(tidyverse)
library(lubridate)
df <- tibble(
  date = seq(ymd_hm("2019-01-01 00:00"), by = "min", length.out = 60 * 24 * 7),
  value = rnorm(n = 60 * 24 * 7)
)
df
#> # A tibble: 10,080 x 2
#>    date                  value
#>    <dttm>                <dbl>
#>  1 2019-01-01 00:00:00  0.182 
#>  2 2019-01-01 00:01:00  0.616 
#>  3 2019-01-01 00:02:00 -0.252 
#>  4 2019-01-01 00:03:00  0.0726
#>  5 2019-01-01 00:04:00 -0.917 
#>  6 2019-01-01 00:05:00 -1.78  
#>  7 2019-01-01 00:06:00 -1.49  
#>  8 2019-01-01 00:07:00 -0.818 
#>  9 2019-01-01 00:08:00  0.275 
#> 10 2019-01-01 00:09:00  1.26  
#> # ... with 10,070 more rows
df %>%
  mutate(
    nearest_15_mins = floor_date(date, "15 mins")
  ) %>%
  group_by(nearest_15_mins) %>%
  summarise(
    avg_value_at_15_mins_int = mean(value)
  )
#> # A tibble: 672 x 2
#>    nearest_15_mins     avg_value_at_15_mins_int
#>    <dttm>                                 <dbl>
#>  1 2019-01-01 00:00:00                  -0.272 
#>  2 2019-01-01 00:15:00                  -0.129 
#>  3 2019-01-01 00:30:00                   0.173 
#>  4 2019-01-01 00:45:00                  -0.186 
#>  5 2019-01-01 01:00:00                  -0.188 
#>  6 2019-01-01 01:15:00                   0.104 
#>  7 2019-01-01 01:30:00                  -0.310 
#>  8 2019-01-01 01:45:00                  -0.173 
#>  9 2019-01-01 02:00:00                   0.0137
#> 10 2019-01-01 02:15:00                   0.419 
#> # ... with 662 more rows

相关内容

  • 没有找到相关文章

最新更新