1

私のデータは 988, 785 obs です。3変数の。私のデータの小さな例を以下に示します。

Names <- c("Jack", "Jill", "John")
RawAccelData <- data.frame(
  Sample = as.numeric(rep(1:60000, each = 3)),
  Acceleration = rnorm(6000),
  ID = rep((Names), each = 60000)
)

私の機器のサンプルレートは 100 Hz です。1 ~ 10 秒間のAccelerationfor eachのローリング平均を計算したいと考えています。ID私は以下を使用してこれを実行します。

require(dplyr)
require(zoo)

for (summaryFunction in c("mean")) {
  for ( i in seq(100, 1000, by = 100)) {
    tempColumn <- RawAccelData %>%
      group_by(ID) %>%
      transmute(rollapply(Acceleration,
                          width = i, 
                          FUN = summaryFunction, 
                          align = "right", 
                          fill = NA, 
                          na.rm = T))
    colnames(tempColumn)[2] <- paste("Rolling", summaryFunction, as.character(i), sep = ".")
    RawAccelData <- bind_cols(RawAccelData, tempColumn[2])
  }
}

ただし、1 ~ 10 分間のローリング オーバーを計算する必要があります。上記のコードを使用して、次の行に置き換えることでこれを行うことができます。

for ( i in seq(6000, 60000, by = 6000)) {

ただし、これはデータセットを処理するのに何時間もかかり、Mac 上の RStudio (詳細は後述) がハングします。a)上記のコードを整理するか、b)別のパッケージ/メソッドを使用してより迅速な結果を有効にする方法はありますか?

ありがとうございました。

R version 3.2.3 (2015-12-10)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.10.5 (Yosemite)

locale:
[1] en_AU.UTF-8/en_AU.UTF-8/en_AU.UTF-8/C/en_AU.UTF-8/en_AU.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] zoo_1.7-12  dplyr_0.4.3

loaded via a namespace (and not attached):
 [1] lazyeval_0.1.10 magrittr_1.5    R6_2.1.1        assertthat_0.1  parallel_3.2.3  DBI_0.3.1      
 [7] tools_3.2.3     Rcpp_0.12.2     grid_3.2.3      lattice_0.20-33
4

2 に答える 2

1

他の集計関数を念頭に置いているかどうかはわかりませんが、少なくとも平均的には、代わりに次 rollapplyを使用して関数を高速化できます。filtertransmute(stats::filter(Acceleration,rep(1/i,i),sides=1))

(ここで他のオプションを参照してください: R での移動平均の計算) を使用system.timeすると、117 秒から 4 秒にスピードアップしました!!

forいくつかのループを並行して実行することもできます。それ以外の

for ( i in seq(6000, 60000, by = 6000)) {

試す:

library(parallel)
for (summaryFunction in c("mean")) {
  rollCols = mclapply (seq(100, 1000, by = 100),function(i){
    tempColumn <- RawAccelData %>%
    group_by(ID) %>%
    transmute(stats::filter(Acceleration,rep(1/i,i),sides=1))
    colnames(tempColumn)[2] <- paste("Rolling", summaryFunction, as.character(i), sep = ".")
    return(tempColumn[2])
  })
}

RawAccelData = cbind(RawAccelData,do.call(cbind,rollCols))

これにより、72秒から40秒にスピードアップしましたが、コンピューターのコア数によって異なります.

于 2016-03-14T01:01:51.293 に答える