Я хочу запустить функцию в каждой группе набора данных и связать вывод с существующим набором в среде Tidyverse. После примера набора я добавил, как я делаю это прямо сейчас, что требует разделения набора и запуска lapply (я хочу переместить все в сторону тидиверса).

library(TTR)

test = data.frame('high'=rnorm(100,10,0.1),'low'=rnorm(100,0,0.1), 'close'=rnorm(100,5,0.1)) 

stoch(test,
      nFastK = 14, nFastD = 3, nSlowD = 3, 
      maType=list(list(SMA), list(SMA), list(SMA)),
      bounded = TRUE,
      smooth = 1)

Вот как это делалось со списками:

    get_stoch = function(dat_) {
  
  stochs = stoch(dat_ %>% select(-ticker), nFastK = 14, nFastD = 3, nSlowD = 3,
                 maType=list(list(SMA), list(SMA), list(SMA)),
                 bounded = TRUE, smooth = 1)
  
  dat_ = cbind(dat_,stochs)
  
}

test = data.frame('ticker'=c(rep('A',50),rep('B',50)),
                  'high'=rnorm(100,10,0.1),'low'=rnorm(100,0,0.1), 'close'=rnorm(100,5,0.1)) %>%
  split(.,.$ticker) %>%
  lapply(.,get_stoch) %>%
  bind_rows
1
spazznolo 19 Июл 2020 в 16:33

2 ответа

Лучший ответ

Вы можете использовать plyr::ddply для запуска метода split-apply-bind на языке, подобном Tidyverse:

df <- data.frame(ticker = c(rep('A', 50), rep('B', 50)),
                 high   = rnorm(100, 10, 0.1),
                 low    = rnorm(100, 0, 0.1), 
                 close  = rnorm(100, 5, 0.1))

test1 <- df %>%
           split(.,.$ticker) %>%
           lapply(.,get_stoch) %>%
           bind_rows

test2 <- df %>%
           ddply("ticker", get_stoch)

identical(test1, test2)
#> [1] TRUE
1
Allan Cameron 19 Июл 2020 в 14:01

Если вы хотите перевести свой код на tidyverse, вы можете использовать:

library(dplyr)
library(purrr)

df %>% group_split(ticker) %>% map_dfr(get_stoch)
2
Ronak Shah 19 Июл 2020 в 14:07
62980971