2017-02-27 74 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)