2017-12-14 5 views
0

タイムスタンプ付き(ソート済み)の観測データフレームがあります。Rではどのように(dplyr)行をフィルタリングしてコンテキスト行を取得できますか?

変数の値をフィルタリングし、変数条件を満たしていないにもかかわらず周辺(コンテキスト)の観測値を取得する方法はありますか?

編集:

私は現在、リードとラグを追加する条件+とのサブセットを使用していますが、それはそれを行うための最も効率的な方法であれば、私はわからない:

df <- subset(df, var1==1 | var1==2 | lag(var1)==1 | lead(var1)==1 ...) 

コード私はそれが最も効率的かどうかを知ることに興味があります。

+0

はい、 が失敗した例のデータとコードを共有してください。.. – Joyvalley

答えて

1

サブセットする別の方法はdplyr::filterを使用しています。

df %>% filter(var1 == 1 | var1 == 2 | lag(var1) == 1 | lead(var1) == 1) 

は今、あなたはおそらく小さなデータセットのためにそれを行うための最も効率的な方法があります。これは次のベンチマークから見ることができます。あなたは、行の数を増やす場合

library(tidyverse) 
df <- data_frame(var1 = sample(c(1,2), 2000, replace = T)) 

library(microbenchmark) 

microbenchmark(your_attempt = {subset(df, var1==1 | var1==2 | lag(var1)==1 | lead(var1)==1)}, 
       new_attempt = { 
       df %>% filter(var1 == 1 | var1 == 2 | lag(var1) == 1 | lead(var1) == 1)}, 
       base_r = {df[df$var1 == 1|df$var1 == 2|lag(df$var1) == 1| lead(df$var1) == 1,]} 
       ) 

# Unit: microseconds 
# expr  min  lq  mean median  uq  max neval 
# your_attempt 266.229 281.7310 305.9987 292.255 322.2625 517.952 100 
# new_attempt 1492.703 1582.2990 1666.6932 1616.716 1684.2690 3540.049 100 
#  base_r 396.215 419.8235 446.8327 435.183 470.1675 646.232 100 

identical(your_attempt, new_attempt) 
# [1] TRUE 
identical(your_attempt, base_r) 
# [1] TRUE 

しかし、(200000へ、すなわちdf <- data_frame(var1 = sample(c(1,2), 200000, replace = T)))、new_attemptは、他のオプションをoutmatches:

# Unit: milliseconds 
#   expr  min  lq  mean median  uq  max neval 
# your_attempt 7.946764 10.631808 15.830630 10.985358 11.73526 97.73276 100 
# new_attempt 6.472834 7.447442 9.530072 9.142661 9.66815 88.33425 100 
#  base_r 7.227434 9.903517 14.141587 10.424741 10.84783 89.66881 100 
関連する問題