示例数据框:
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
我想创建一个单一的boxplot来显示每列的“total”分布:a,b,c但只考虑value = 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列而认为我可以使用melt()。提前谢谢。
编辑:显然,我应该/可以使用melt(),只需要正确使用它。
答案 0 :(得分: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()
答案 1 :(得分: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)