サブセットする別の方法は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
はい、 が失敗した例のデータとコードを共有してください。.. – Joyvalley