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

如何在dplyr管道中调用输出长度>1的quantile函数且不使用summarise_at等函数?

在dplyr管道中调用返回多值的汇总函数(如quantile)

嘿,我懂你想在dplyr管道里直接用quantile这类会返回多个结果的汇总函数,又不想依赖summarise_at这类函数的需求!下面结合你的示例数据,给你几个实用的解决方案:

首先先把你的示例数据放出来,方便测试:

set.seed(1)
id = 1:20
value = sample(20:100, size = 20)
my_dat = data.frame(id, value)

library(dplyr)

方法1:用reframe()(推荐,dplyr 1.0.0+可用)

reframe()是dplyr专门为处理返回多行/多列的汇总函数设计的,完美适配你的需求:

my_dat %>%
  reframe(
    quantile_value = quantile(value, probs = seq(0, 1, 0.25)),
    probability = seq(0, 1, 0.25)
  )

运行后会得到一个规整的数据框,每行对应一个分位数和它对应的概率值,完全符合tidy数据的格式。

方法2:用summarize() + list() + 展开

如果你用的dplyr版本比较旧,或者习惯用summarize,可以先把多值结果存成列表列,再用tidyr::unnest展开:

library(tidyr)

my_dat %>%
  summarize(
    quantile_list = list(quantile(value, probs = seq(0, 1, 0.25))),
    prob_list = list(seq(0, 1, 0.25))
  ) %>%
  unnest(c(quantile_list, prob_list)) %>%
  rename(quantile = quantile_list, prob = prob_list)

这个方法先把分位数和概率都存成列表,再拆成单独的行,结果和reframe一致。

方法3:直接提取向量后调用(适合只需要数值向量的场景)

如果只是需要quantile返回的数值向量,不需要数据框格式,可以先用pull()提取value列,再调用函数:

my_dat %>%
  pull(value) %>%
  quantile(probs = seq(0, 1, 0.25))

这个方法最简洁,但返回的是一个命名向量,不是数据框,适合快速查看结果的场景。

顺便提一句:你之前尝试的my_dat %>% quantile(.$value, ...)虽然能运行,但本质是把整个数据框传给quantile的第一个参数,然后手动用.$value指定要计算的列,这种写法不符合dplyr的数据流习惯,而且返回的是向量,不如上面的方法规整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:00:25