首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按组转换数据

按组转换数据
EN

Stack Overflow用户
提问于 2014-12-02 01:57:17
回答 1查看 444关注 0票数 4

我想知道是否有可能在执行分组之后应用(数据的) ggplot2转换。

示例:

这是一个按物种划分的iris图:

代码语言:javascript
复制
ggplot(iris, aes(sample=Sepal.Width, col=Species)) +
    stat_qq() +
    ggtitle('qqnorm of Sepal Width')

我想通过Sepal.Width转换(x - mean(x))/sd(x)

代码语言:javascript
复制
normalize = function (x) (x - mean(x))/sd(x)
ggplot(iris, aes(sample=normalize(Sepal.Width), col=Species)) +
    stat_qq() +
    ggtitle('qqnorm of Sepal Width, normalized globally')

请注意,这使用了全局平均值/sd来进行规范化,而不是使用每个组的平均值/sd(如果您编写aes(sample=(Sepal.Width - mean(Sepal.Width))/sd(Sepal.Width))而不是将其隐藏在normalize中,情况也是如此。

问题:是否有一种方法将normalize 应用于每一组(物种)?

我可以用ddply来完成它,只是想知道是否有一种优雅的方法将仿射转换应用到ggplot调用中的数据,其中转换参数是每个组的。

代码语言:javascript
复制
ggplot(ddply(iris, .(Species), mutate, y=normalize(Sepal.Width)),
             aes(sample=y, col=Species)) +
    stat_qq() +
    ggtitle('qqnorm of Sepal.Width, normalized within-group')

EN

回答 1

Stack Overflow用户

发布于 2014-12-02 10:35:29

您还可以将函数normalize更改为接受一个更高级的by。这使得normalize函数更加复杂,但简化了ggplot调用(与plyr解决方案相比)。有关如何定义规范化的建议,请参见下面的内容。

代码语言:javascript
复制
# new normalize command
normalize <- function(x, by='none'){
  unsplit(lapply(unique(by), function(id) scale(x[by==id])), by)
} 
# global normalization
ggplot(iris, aes(sample=normalize(Sepal.Width), col=Species)) +
  stat_qq() +
  ggtitle('qqnorm of Sepal Width, normalized globally')
# groupe-wise normalization
ggplot(iris, aes(sample=normalize(Sepal.Width, by=Species), col=Species)) +
  stat_qq() +
  ggtitle('qqnorm of Sepal Width, normalized by species')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27240655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档