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

使用自定义tidyverse函数时group_by引发grp列未找到问题

解决分组应用百分位排名函数的报错问题

问题根源

取消group_by(grp)注释后报错找不到grp列,核心原因是:

  • 原函数中多次调用as.data.frame()会丢失分组信息,导致函数返回的无分组数据框和原分组数据无法正确匹配
  • 函数返回完整数据框而非单列向量,在分组mutate场景下容易出现结构不兼容的问题

修复后的代码

set.seed(123)

pacman::p_load(tidyverse)

df <- data.frame(
  grp = sample(c("A","B"), size = 100, replace = TRUE),
  x = sample(1000, size = 100),
  y = sample(10000, size = 100)
)

calculate_percentile_rank <- function(data, point_var, lookback_var, lags) {
  # 动态生成滞后列名称
  lag_col_names <- str_glue("{quo_name(enquo(lookback_var))}_lag_{lags}")
  
  data %>%
    # 按组生成指定滞后数的列(分组时自动按组计算滞后)
    mutate(across({{lookback_var}}, 
                 list(!!!set_names(map(lags, ~partial(lag, n = .x)), lags)),
                 .names = "{.col}_lag_{.fn}")) %>%
    rowwise() %>%
    # 构造包含当前point_var和所有滞后lookback值的向量
    mutate(lag_vector = list(c_across(c({{point_var}}, all_of(lag_col_names))))) %>%
    # 计算当前x在向量中的百分位排名
    mutate(pct_rank = percent_rank(lag_vector)[[1]]) %>%
    # 提取结果作为向量返回,适配分组mutate场景
    pull(pct_rank)
}

# 分组应用函数并输出结果
test <- df %>% 
  group_by(grp) %>% 
  mutate(pct_rank = calculate_percentile_rank(data = ., lookback_var = y, point_var = x, lags = 1:3)) %>%
  ungroup()

关键修改点

  1. 保留分组结构:移除所有as.data.frame()调用,全程使用tidyverse的tibble结构,确保分组信息不会丢失
  2. 动态列名处理:用enquo和str_glue生成滞后列名,避免硬编码,提升函数通用性
  3. 返回向量而非数据框:最后用pull(pct_rank)返回单列向量,完美适配分组mutate的赋值逻辑
  4. 简化代码结构:合并重复的rowwise()调用,直接在mutate中提取百分位排名的第一个值,避免冗余的列表操作

内容的提问来源于stack exchange,提问作者TheGoat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:35:32