我想知道是否有可能在执行分组之后应用(数据的) ggplot2转换。
示例:
这是一个按物种划分的iris图:
ggplot(iris, aes(sample=Sepal.Width, col=Species)) +
stat_qq() +
ggtitle('qqnorm of Sepal Width')

我想通过Sepal.Width转换(x - mean(x))/sd(x)
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调用中的数据,其中转换参数是每个组的。
ggplot(ddply(iris, .(Species), mutate, y=normalize(Sepal.Width)),
aes(sample=y, col=Species)) +
stat_qq() +
ggtitle('qqnorm of Sepal.Width, normalized within-group')

发布于 2014-12-02 10:35:29
您还可以将函数normalize更改为接受一个更高级的by。这使得normalize函数更加复杂,但简化了ggplot调用(与plyr解决方案相比)。有关如何定义规范化的建议,请参见下面的内容。
# 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')https://stackoverflow.com/questions/27240655
复制相似问题