我想知道是否可以在执行分组后应用ggplot2转换(数据)。
示例:
以下是iris
种类的qqplot:
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')
答案 0 :(得分:1)
您也可以更改功能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')