2017-12-07 17 views
1

私は単純なdata.frameを持っています。ここではいくつかの要約統計量を繰り返し計算したいと思っています。例えば、5つの観測(2つの遅れ、先に現在の2)のウィンドウにわたって圧延メジアンしかしながら現在の行を持たないrollaplyを使用

library(dplyr) 
x <- data.frame("vals" = rnorm(3e04)) 
y <- x %>% 
     mutate(med5 = rollapply(data = vals, 
       width = 5, 
       FUN = median, 
       align = "center", 
       fill = NA, 
       na.rm = TRUE)) 

によって達成される、私はこの計算から現在の行を除外したいと思います。私は、次のアプローチを見つけた:

z <- x %>% 
     mutate(N=1:n()) %>% 
     do(data.frame(., prmed = sapply(.$N, function(i) median(.$vals[.$N %in% c((i - 2):(i - 1), (i + 1):(i + 2))])))) 

私はその後NAに最初の2つの値を設定する場合、これは、私が欲しいものを行います。

これまでのところ、唯一の問題は、後者のアプローチがrollapplyに比べて非常に遅いということです。

前者のスピードで後者の結果を達成する方法はありますか?

答えて

1

計算の現在の行である5の3番目の数を除いた解。 rollapply

library(dplyr) 
library(zoo) 

set.seed(124) 

x <- data.frame("vals" = rnorm(3e04)) 
y <- x %>% 
    mutate(med5 = rollapply(data = vals, 
          width = 5, 
          FUN = function(x) median(x[-3], na.rm = TRUE), 
          align = "center", 
          fill = NA)) 

head(y) 
#   vals  med5 
# 1 -1.38507062  NA 
# 2 0.03832318  NA 
# 3 -0.76303016 0.1253147 
# 4 0.21230614 0.3914015 
# 5 1.42553797 0.4562678 
# 6 0.74447982 0.4562678 
+1

魅力のように動作します、ありがとう!エレガントで、簡単で、中央値以外の機能に簡単に一般化できます。 – Akkariz

2

width=引数は、オフセットのベクターを含有する1つの要素リストを指定できます。

y <- x %>% 
    mutate(med5 = rollapply(data = vals, 
          width = list(c(-2, -1, 1, 2)), 
          FUN = median, 
          na.rm = TRUE, 
          fill = NA)) 

align = "center"がデフォルトであるため、指定する必要はありません。さらに、オフセットを使用すると、align=は無視されます。安全のため、Tも変数名にすることができるので、TRUEを完全に書き出す必要があります。

関連する問題