如何在非分组数据框中使用ggplot2:::compute_density计算核密度估计?
解决非分组数据框使用
ggplot2:::compute_density的问题 嘿,我明白你的困惑了!分组场景下group_modify能正常工作,是因为它会把每个分组的处理结果自动合并成一个数据框;但非分组时用mutate不行,本质是mutate要求新增的列和原数据框行数一致,而compute_density返回的是多行多列的密度计算结果,完全不符合mutate的要求。
下面给你两个直接可行的方案:
方案1:直接调用函数(最简单)
既然compute_density本身接受向量作为输入,并且直接返回数据框,那非分组场景下完全不需要借助dplyr的动词,直接调用就行:
ggplot2:::compute_density(mtcars$am, NULL)
运行后你会得到和分组时单个分组一样的结果结构,包含x、density、scaled这些列。
方案2:用reframe替代mutate(适配dplyr管道)
如果你习惯用dplyr的管道风格,可以用reframe函数——它和mutate的核心区别是:允许返回任意行数的结果,完美匹配compute_density的输出:
mtcars %>% reframe(ggplot2:::compute_density(am, NULL))
这样就能在管道里完成操作,输出的结果和直接调用函数完全一致。
额外提醒:关于内部函数的风险
注意ggplot2:::compute_density是ggplot2的内部函数(三个冒号的调用方式),它不属于ggplot2对外公开的API,意味着未来版本的ggplot2可能会修改甚至移除这个函数,导致你的代码失效。如果追求稳定性,建议用R基础包的stats::density自己整理结果,比如:
mtcars %>% reframe( x = density(am)$x, density = density(am)$y, scaled = density(am)$y / max(density(am)$y) )
这个结果和compute_density的输出结构几乎一致,但用的是公开稳定的函数,不用担心版本兼容问题。
内容的提问来源于stack exchange,提问作者TheGoat
相关产品推荐
相关产品推荐

