【问题标题】:R: How to transform 3 seperate numeric variables into 3 levels of one variable?R:如何将 3 个单独的数值变量转换为一个变量的 3 个级别?
【发布时间】:2021-07-23 17:25:49
【问题描述】:

我目前正在创建一个图表,该图表将为每个 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, n, replace = TRUE),
                  Glove_Size = sample(1:7, n, 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", "Exp", "Exp", "Control", "Control", "Control", "Control",
                              "Exp", "Exp", "Exp", "Exp", "Control", "Control", "Control", "Control",
                              "Exp", "Exp", "Exp", "Exp", "Control", "Control", "Control", "Control"),
                      Sex = c("Male", "Male", "Female", "Female", "Male", "Male", "Female", "Female",
                              "Male", "Male", "Female", "Female", "Male", "Male", "Female", "Female",
                              "Male", "Male", "Female", "Female", "Male", "Male", "Female", "Female"),
                      Ideology = c("Conservative", "Liberal","Conservative", "Liberal","Conservative", "Liberal","Conservative", "Liberal",
                                   "Conservative", "Liberal","Conservative", "Liberal","Conservative", "Liberal","Conservative", "Liberal",
                                   "Conservative", "Liberal","Conservative", "Liberal","Conservative", "Liberal","Conservative", "Liberal"),
                      Clothes = c("Shoes","Shoes","Shoes","Shoes","Shoes","Shoes","Shoes","Shoes",
                                  "Hats","Hats","Hats","Hats","Hats","Hats","Hats","Hats",
                                  "Gloves","Gloves","Gloves","Gloves","Gloves","Gloves","Gloves","Gloves"),
                      Mean_Size = c(3.16, 2.5, 2.1, 7, 5.1, 2.9, 2.1, 6.4,
                               2.63, 3.1, 3.61, 4.4, 3.7, 2.1, 1.2, 2.7, 
                               5.7, 3.2, 2.1, 2.6, 3.1, 6.2, 2.1, 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()function。

我的理论是,要做到这一点,我需要将这三个独立的数值变量(Shoe_SizeHat_SizeGlove_Size)转换为一个变量的三个级别(Clothes),这样我可以将那个变量放在我的图表的 x 轴上,就像我“手动”完成的那样。

我的问题(和问题)是:

  1. 我的理论正确吗?
  2. 是否可以在不手动操作的情况下创建类似于上述的图表?

在我学习的这个阶段,这是我第二次尝试尽可能清楚地解释我的问题,所以如果还有什么不是 100% 清楚,我深表歉意。

任何建议或提示都会有很大帮助!

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。
  • Jacob,这是一个有趣的问题,但这里离题了;改用 stats.stackexchange.com。也就是说,转换是否有意义在很大程度上取决于您拥有哪些数据以及您要达到的目标。我的建议是多说一些。

标签: r variables graph statistics


【解决方案1】:

也许这就是你要问的。下次你应该自己编数据:

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.5, 6.625, 6.75, 6.875, 7, 7.125, 
              7.25, 7.375, 7.5, 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 2021-03-02
    • 1970-01-01
    • 2019-08-15
    相关资源
    最近更新 更多