问题描述
我目前正在创建一个图表,该图表将为每个 2x2x2 因子设计组显示 3 个均值。
这是我在 R 中的数据的一个简单示例:
####Reproducible Example
set.seed(44)
n <- 48
Condition <- c("Exp","Control")
Sex <- c("Male","Female")
Ideology <- c("Conservative","Ideology")
dat <- data.frame(id = 1:n,tidyr::crossing(Condition,Sex,Ideology),Shoe_Size = sample(1:7,n,replace = TRUE),Hat_Size = sample(1:7,glove_Size = sample(1:7,replace = TRUE))
> head(dat)
id Condition Sex Ideology Shoe_Size Hat_Size glove_Size
1 1 Control Female Conservative 1 1 6
2 2 Control Female Ideology 3 5 3
3 3 Control Male Conservative 3 5 4
4 4 Control Male Ideology 1 2 1
5 5 Exp Female Conservative 6 2 6
6 6 Exp Female Ideology 4 3 7
我的目标是创建一个这样的图表:
无需像这样手动操作:
####Graph Example
library(ggplot2)
dat.graph <- data.frame(Condition = c("Exp","Exp","Control","Control"),Sex = c("Male","Male","Female","Female"),Ideology = c("Conservative","Liberal","Conservative","Liberal"),Clothes = c("Shoes","Shoes","Hats","gloves","gloves"),Mean_Size = c(3.16,2.5,2.1,7,5.1,2.9,6.4,2.63,3.1,3.61,4.4,3.7,1.2,2.7,5.7,3.2,2.6,6.2,2.6))
ggplot(data = dat.graph,aes(x = Clothes,y = Mean_Size,fill = Ideology)) +
geom_bar(stat = "identity",width = .5,position = "dodge") +
facet_wrap(~ Condition + Sex,ncol = 6,drop = FALSE) +
theme(
axis.text.x = element_text(angle=50,hjust=1)
)
注意:为了节省时间,Mean_Size 值不是来自 dat
数据框的实际平均值。为了获得这些,我必须对每个数字变量使用 aggregate()
函数。
我的理论是,要做到这一点,我需要将这三个独立的数值变量(Shoe_Size
、Hat_Size
和 glove_Size
)转换为一个变量的三个级别({ {1}}) 这样我就可以将那个变量放在图表的 x 轴上,就像我“手动”完成的那样。
我的问题(和问题)是:
- 我的理论正确吗?
- 是否可以在不手动操作的情况下创建像上面展示的那样的图表?
这是我第二次尝试在学习的这个阶段尽可能清楚地解释我的问题,所以如果有任何事情还没有 100% 清楚,我深表歉意。
任何建议或提示都会有很大帮助!
解决方法
也许这就是您要问的。下次你应该自己补数据:
ShoeSizes <- c(6,6.5,7,7.5,8,8.5,9,9.5,10,10.5,11,11.5,12)
HatSizes <- c(6,6.125,6.25,6.375,6.625,6.75,6.875,7.125,7.25,7.375,7.625,7.75,7.875,8)
SockSizes <- c(10,12,14)
Clothes.list <- list(Shoes=ShoeSizes,Hats=HatSizes,Socks=SockSizes)
Clothes.df <- stack(Clothes.list)[,2:1]
colnames(Clothes.df) <- c("Type","Size")
str(Clothes.df)
# 'data.frame': 33 obs. of 2 variables:
# $ Type: Factor w/ 3 levels "Shoes","Hats",..: 1 1 1 1 1 1 1 1 1 1 ...
# $ Size: num 6 6.5 7 7.5 8 8.5 9 9.5 10 10.5 ...
head(Clothes.df); tail(Clothes.df)
# Type Size
# 1 Shoes 6.0
# 2 Shoes 6.5
# 3 Shoes 7.0
# 4 Shoes 7.5
# 5 Shoes 8.0
# 6 Shoes 8.5
# Type Size
# 28 Hats 7.750
# 29 Hats 7.875
# 30 Hats 8.000
# 31 Socks 10.000
# 32 Socks 12.000
# 33 Socks 14.000