R:如何将 3 个单独的数值变量转换为一个变量的 3 个级别?

问题描述

我目前正在创建一个图表,该图表将为每个 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 that I'm after

无需像这样手动操作:

####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_SizeHat_Sizeglove_Size)转换为一个变量的三个级别({ {1}}) 这样我就可以将那个变量放在图表的 x 轴上,就像我“手动”完成的那样。

我的问题(和问题)是:

  1. 我的理论正确吗?
  2. 是否可以在不手动操作的情况下创建像上面展示的那样的图表?

这是我第二次尝试在学习的这个阶段尽可能清楚地解释我的问题,所以如果有任何事情还没有 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