2017-02-27 40 views
0

实施例的数据帧:ggplot箱线图的多个列以因子与条件

a <- c(1, 0, 1) 
b <- c(0, 1, 0) 
c <- c(1, 0, 1) 
total <- c(100,200,300) 
my.data <- data.frame(a, b, c, total) 

> my.data 
    a b c total 
1 1 0 1 100 
2 0 1 1 200 
3 1 0 1 300 

我想创建一个单独的箱线图,以显示“总”的各列的分配:A,B,C,但只考虑那些值为1. 示例:列a的第2行因为它为0而被忽略,所以列a的分布为100和300.列B的分布为200,列c的分布为100,200,300。

我可以单独绘制出来:

ggplot(subset(my.data,a==1), aes(x=a,y=total)) + 
geom_boxplot() 

ggplot(subset(my.data,b==1), aes(x=b,y=total)) + 
geom_boxplot() 

ggplot(subset(my.data,c==1), aes(x=c,y=total)) + 
geom_boxplot() 

我也试过以下,但它是不正确:

ggplot(my.data, aes(x=as.factor(c("a","b","c")),y=total)) + 
geom_boxplot() 

希望有一个真棒一个R函数/方法,让我做我的阴谋一枪。不要以为我可以使用熔化(),因为Total列。提前致谢。


编辑:显然,我应该/可以使用熔化(),只需要正确使用它。

回答

2

你的数据应该是长格式,使用包Reshape2,例如

library(reshape2) 
my.data <- melt(my.data, measure.vars=c("a","b","c")) 

ggplot(subset(my.data, value==1), aes(x=variable,y=total)) + 
geom_boxplot() 
+0

漂亮!谢谢@ user3640617。 – Perceptron

1

user3640617的答案是正确的,但如果你想避免老reshape2包,你可以做较新的等价tidyverse

library(tidyverse) 
my.data <- gather(my.data, group, has.data, a:c) %>% 
    subset(has.data == 1) 

plot.data <- ggplot(data = my.data, aes(x = group, y = total)) + 
    geom_boxplot() 
print(plot.data)