首页 文章

如何绘制分组列联表

提问于
浏览
1

我正在使用一个名为 UCBAdmissions 的R内置数据集,并尝试创建一个分组的条形图,其数据被强制转换为数据帧,并按 AdmitGenderDept 分组(不使用 ggplot ) .

data(UCBAdmissions)
as.data.frame(UCBAdmissions)
      Admit Gender Dept Freq
1  Admitted   Male    A  512
2  Rejected   Male    A  313
3  Admitted Female    A   89
4  Rejected Female    A   19
5  Admitted   Male    B  353
6  Rejected   Male    B  207
7  Admitted Female    B   17
8  Rejected Female    B    8
9  Admitted   Male    C  120
10 Rejected   Male    C  205
11 Admitted Female    C  202
12 Rejected Female    C  391
13 Admitted   Male    D  138
14 Rejected   Male    D  279
15 Admitted Female    D  131
16 Rejected Female    D  244
17 Admitted   Male    E   53
18 Rejected   Male    E  138
19 Admitted Female    E   94
20 Rejected Female    E  299
21 Admitted   Male    F   22
22 Rejected   Male    F  351
23 Admitted Female    F   24
24 Rejected Female    F  317

我尝试以这种方式将数据转换为表格格式,但收到了错误消息 .

> barplot(table(as.data.frame(UCBAdmissions)))
Error in barplot.default(table(as.data.frame(UCBAdmissions))) : 
  'height' must be a vector or a matrix

我发现这个SO链接提供了非ggplot答案,但是收到了上面显示的错误消息 .

还有这个SO链接,但数据结构不同 .

我希望数据只能用两个维度显示 . 这是简化的分组条形图的样子 .

grouped barplot

1 回答

  • 2

    我不确定你想要实现什么,但我会假设你想要按照Dept分组的条形图,而传说是性别和承认的组合(只是为了提出这个想法) .

    在您指向的条形图示例中,数据是纯数字矩阵,其中rownames和colnames设置为标签和分组 . 您需要从转换数据开始(我使用 tidyverse 中的 dplyrtidyr ):

    library(tidyverse)
    df2 = group_by(as.data.frame(UCBAdmissions), Dept, Gender, Admit) %>% 
        summarise(Freq = sum(Freq)) %>%
        ungroup() %>%
        mutate(GA = paste(Gender, Admit)) %>%
        select(Dept, GA, Freq) %>%
        spread(key = Dept, value = Freq) %>%
        as.data.frame()
    rownames(df2) = df2$GA
    df2 = as.matrix(select(df2, -GA))
    

    现在您的数据采用barplot可以使用的形式:

    barplot(df2, beside=TRUE, legend = rownames(df2))
    

    final bar plot

相关问题