выбрать элементы совокупно из вектора в R - PullRequest
2 голосов
/ 09 ноября 2019

Я использую следующее для кумулятивного (то есть, сначала выбирает первые 2 элемента и каждый раз добавляет еще 1; см. Вывод ниже ), выбирает элементы из вектора mods ниже. Интересно, есть ли более быстрый или простой подход к этому в BASE R?

n <- names(mtcars) # BASE R dataset

lapply(seq_along(n)[-1], function(i)n[seq_len(i)]) # any faster or simpler approach here?

[[1]]
[1] "mpg" "cyl"

[[2]]
[1] "mpg"  "cyl"  "disp"

[[3]]
[1] "mpg"  "cyl"  "disp" "hp"  

[[4]]
[1] "mpg"  "cyl"  "disp" "hp"   "drat"

Ответы [ 3 ]

2 голосов
/ 09 ноября 2019

Вы можете использовать Reduce:

Reduce(c, n, accumulate=TRUE)

или, чтобы начать с первых двух элементов:

Reduce(c, tail(n,-2), n[1:2], accumulate=TRUE)

Это проще ИМХО, но не быстрее:

microbenchmark(
    lapply=lapply(seq_along(n)[-1], function(i)n[seq_len(i)]), 
    Reduce=Reduce(c, n, accumulate=TRUE)
)

Unit: microseconds
   expr  min   lq   mean median   uq    max neval
 lapply 10.2 10.6 22.056   10.8 11.0 1119.8   100
 Reduce 10.1 10.4 10.865   10.6 10.8   17.5   100
1 голос
/ 09 ноября 2019

Вот вариант с rep и split

split(n[sequence(seq_along(n))], rep(seq_along(n), seq_along(n)))
0 голосов
/ 09 ноября 2019

Я рекомендую runner пакет и window_run функцию, которая делает именно то, что вы просите. Вы также можете указать количество (k) элементов, которые вы хотите вернуть в каждом окне. Вы также можете указать lag и сделать окна в зависимости от даты. Вот пример:

library(runner)
window_run(names(mtcars))

# [[1]]
# [1] "mpg"
# 
# [[2]]
# [1] "mpg" "cyl"
# 
# [[3]]
# [1] "mpg"  "cyl"  "disp"
# 
# [[4]]
# [1] "mpg"  "cyl"  "disp" "hp"

В бенчмарке это очень похоже на решение Reduce из-за реализации cpp:

microbenchmark::microbenchmark(
  window_run = window_run(names(mtcars)),
      Reduce = Reduce(c, n, accumulate = TRUE),
      lapply = lapply(seq_along(n)[-1], function(i) n[seq_len(i)]),
       times = 1000000L
)
# Unit: microseconds
#        expr    min     lq     mean median     uq       max neval
#  window_run 10.296 12.782 15.45241 13.543 14.467  98018.87 1e+06
#      Reduce 10.979 13.048 15.80921 13.882 14.847  98881.51 1e+06
#      lapply 11.797 14.540 17.42722 15.518 16.729 116346.98 1e+06

Для более подробной информации о проверке Документация

...