繁体   English   中英

如何将 function 应用于分组集并将列绑定到现有 dataframe

[英]How to apply a function to grouped set and bind columns to existing dataframe

我希望在数据集的每组上运行 function,并将 output 绑定到 tidyverse 环境中的现有集合。 在示例集之后,我添加了我现在的操作方式,这需要拆分集并运行 lapply(我想将所有内容移向 tidyverse)。

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

如果您想将您的代码翻译成tidyverse ,您可以使用:

library(dplyr)
library(purrr)

df %>% group_split(ticker) %>% map_dfr(get_stoch)

您可以使用plyr::ddply以类似 tidyverse 的语言运行split-apply-bind方法:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM