You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 14:32:31