【问题标题】:Survey analysis with categorical data and chart plotting使用分类数据和图表绘制的调查分析
【发布时间】:2016-05-17 09:21:29
【问题描述】:

我有一个来自调查的数据库,我从这个数据库中用 R 构建了一个数据框,看起来类似于:

    cnt  <-as.factor(c("Country 1", "Country 2", "Country 3", "Country 1", "Country 2", "Country 3" ))
    bnk  <-as.factor(c("bank 1", "bank 2", "bank 3", "bank 1", "bank 2", "bank 3" ))
    qst  <-as.factor(c("q1", "q1", "q1", "q2","q2","q2" ))
    ans  <-as.numeric(c(1,1,2,1,2,3))
    df   <-data.frame(cnt, bnk, qst,ans)
names(df) <- c("Country", "Institute", "Question", "Answer")

      Country Institute Question Answer
1 Country 1    bank 1       q1      1
2 Country 2    bank 2       q1      1
3 Country 3    bank 3       q1      2
4 Country 1    bank 1       q2      1
5 Country 2    bank 2       q2      2
6 Country 3    bank 3       q2      3

它本质上是这个数据框,它显示有两个不同的问题 - q1,q2,参与者 - 这里来自不同国家的银行 - 必须以一定的数字尺度回答每个问题。

我的目的很简单。我想,对于每个问题,计算并绘制回答为 1 的银行的百分比、回答为 2 的银行的百分比等。

因此,在我们的示例中,有三个银行。关于问题 1,其中 2 个回答了 1,一个回答了 2。所以,我想形象化 - 例如通过条形图 - 有 2/3 的银行(即大约 67%)回答了 1 和 1/3(即 aprx. 33% ) 回答 2. 问题 2 类似。

不确定是否重要,但可能的数字答案的范围可能会因问题而异。也就是说,对于 q1,可用答案的范围是 1 到 2,但问题 2 的范围可能是 1 - 5。

有人可以建议我如何在 R 中快速实现这一点吗?

当然,一种肮脏的方法是计算银行的数量,计算q1(q2)中“1”的数量,然后计算各自的分数。然而,这种方法非常耗时,并且想知道 R 中是否有更好的选择。

更新

完成上述所有操作后,我想问几个问题来创建一个如下所示的条形图:

在上面的示例中,对问题 8 的回答中等于 1 的地方被标记为“我的银行正在……”,而等于 2 的回答中的“我的银行正在启动……” "如上图所示。

不过,我们暂时可以忽略“标记部分”,因为在 x 轴上只放置 1 和 2 就足够了。

【问题讨论】:

    标签: r plot dataframe calculated-columns survey


    【解决方案1】:

    这里是 ggplot 的快速解答

    library(ggplot2)
    
    ggplot(df, aes(x=Question, fill=factor(Answer))) + geom_bar()
    

    输出如下所示:

    计算百分比:

    library(dplyr)
    library(tidyr)
    
    (dat <- df %>% spread(Question, Answer))
        Country Institute q1 q2
    1 Country 1    bank 1  1  1
    2 Country 2    bank 2  1  2
    3 Country 3    bank 3  2  3
    
    dat$q1 %>% table/nrow(dat)
            1         2 
    0.6666667 0.3333333 
    
    dat$q2 %>% table/nrow(dat)
    
            1         2         3 
    0.3333333 0.3333333 0.3333333 
    

    编辑:为下面的评论添加情节

    ggplot(df, aes(x=Answer, fill=factor(Question))) + geom_bar()
    

    编辑:添加以解决更新后的问题:

    df <- data.frame(answer=c(rep(1, 97), rep(2,3)))
    
    ggplot(df, aes(x=as.factor(answer))) + 
      geom_bar(aes(y=(..count..)/sum(..count..)), width=.5) + 
      scale_y_continuous(labels = scales::percent) +
      geom_text(aes(y = ((..count..)/sum(..count..)), label = scales::percent((..count..)/sum(..count..))), stat = "count", vjust = -0.25) +
      labs(title = "Question 8", y = "Percent", x = "") +
      scale_x_discrete(labels=c("My bank has been using \n guarantees already for \n more than 5 years", "My bank has started to use \n guarantees in their last 5 year")) 
    

    【讨论】:

    • 谢谢。这非常有用,尤其是 spread() 函数。当问题很少时,图表很酷,但在我的情况下,当有 49 个问题时,它很方便。所以,我更喜欢为每个问题制作一个条形图,其中 x 轴显示可能的答案——即 1 或 2,y 轴显示百分比。因此,我想知道是否有必要计算生成这种图表的百分比。
    • 见上面的编辑答案。通常不需要为大多数数据图生成汇总统计信息。
    • 谢谢亚当,这也很棒。我想我会用它来解决几个问题。但是,您还请建议我如何获得与我的问题已更新的图表类似的图表?请再次检查我的问题以获取更新。
    • 这很棒。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2021-02-02
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 2016-12-21
    • 2018-04-06
    相关资源
    最近更新 更多