如何在tidyverse环境下对分组数据集应用函数并绑定结果至原数据框
在Tidyverse中按分组运行
stoch()并绑定结果 没问题!要在tidyverse环境下实现按分组运行stoch()函数,还能把结果直接绑定到原数据集,完全不用拆分列表那套操作,我们有两种很地道的tidyverse方案可以选,一起来看看:
方法1:使用group_modify()(推荐,逻辑更直观)
group_modify()专门用来处理需要对每个分组返回数据框的场景,刚好匹配stoch()返回多列数据框的特性,代码连贯且易读:
# 加载必要包 library(tidyverse) library(TTR) # 构造可重复的测试数据 set.seed(123) test <- tibble( 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) ) # 分组计算并绑定结果 test_with_stoch <- test %>% group_by(ticker) %>% group_modify(function(.x, .y) { # .x是当前分组的数据集(自动剔除了分组列ticker) stoch_result <- stoch( .x, nFastK = 14, nFastD = 3, nSlowD = 3, maType = list(list(SMA), list(SMA), list(SMA)), bounded = TRUE, smooth = 1 ) # 把原分组数据和stoch计算结果横向绑定 bind_cols(.x, stoch_result) }) %>% ungroup() # 结束分组操作,方便后续处理
代码解释:
group_by(ticker):按ticker列分组group_modify():遍历每个分组,传入的函数接收两个参数:.x:当前分组的完整数据集(不含分组列ticker).y:包含当前分组键的单行数据框(这里我们用不到,但必须作为参数保留)
bind_cols(.x, stoch_result):将原分组数据和stoch()的计算结果合并成一个数据框,group_modify()会自动把所有分组的结果重新组合成最终的大数据框
方法2:使用mutate() + map() + unnest_wider()
如果你习惯用列表列的思路,也可以先把每个分组的stoch()结果存为列表列,再展开成单独的列:
test_with_stoch <- test %>% group_by(ticker) %>% mutate( # 用list()把每个分组的stoch结果包装成列表列 stoch_data = list( stoch( cur_data(), # cur_data()获取当前分组的非分组列数据 nFastK = 14, nFastD = 3, nSlowD = 3, maType = list(list(SMA), list(SMA), list(SMA)), bounded = TRUE, smooth = 1 ) ) ) %>% unnest_wider(stoch_data) %>% # 把列表列展开成单独的列 ungroup()
代码解释:
cur_data():获取当前分组中除了分组列之外的所有数据,刚好符合stoch()的输入要求list():把stoch()返回的数据框包装成列表元素,这样就能存在tibble的一列中unnest_wider():将列表列中的每个数据框展开成单独的列,和原数据合并
这两种方法都完全基于tidyverse生态,不需要拆分数据集再手动合并,代码更简洁易维护,而且保持了tidyverse一贯的流水线操作风格。
内容的提问来源于stack exchange,提问作者spazznolo
相关产品推荐
相关产品推荐

