【问题标题】:Analyse multiple choice questions with multiple choice answers based on categories根据类别分析具有多项选择答案的多项选择题
【发布时间】:2016-09-24 18:58:22
【问题描述】:

我有一个看起来像这样的数据框

Country    <- rep(c("Austria", "Austria","Belgium", "Belgium", "Spain", "Slovenia", "France"), times=3)
Institute  <- rep(c("Inst 1","Inst 2","Inst 3","Inst 4","Inst 5","Inst 6","Inst 7"), times=3)
Ans        <- rep(c(1,2,3,1,NA,2,2),times=3)
Category.1 <- rep(c("Cat 1", "Cat 2", "Cat 2", "Cat 2","Cat 2", "Cat 1", "Cat 1"),times=3)
Category.2 <- rep(c("P", "L", "M", "P", "P", "L", "M"),times=3)
qs  <- c(rep("Q1.a-Some Text", times=7),rep("Q1.b-Some Text", times=7), rep("Q1.c-Some Text", times=7))    
df <- data.frame(Country=Country,Institute=Institute, Category.1=Category.1, Category.2=Category.2, qs=qs, Ans=Ans)
df<-df %>% spread(qs,Ans)
head(df)

 Country Institute Category.1 Category.2 Q1.a-Some Text Q1.b-Some Text Q1.c-Some Text
1  Austria    Inst 1      Cat 1          P              1              1              1
2  Austria    Inst 2      Cat 2          L              2              2              2
3  Belgium    Inst 3      Cat 2          M              3              3              3
4  Belgium    Inst 4      Cat 2          P              1              1              1
5   France    Inst 7      Cat 1          M              2              2              2
6 Slovenia    Inst 6      Cat 1          L              2              2              2

对数据框的简短解释:有一些问题,比如 Q1,对于这个问题,有多个“子问题”,比如 a、b、c,其中每个“子问题/选项”受访者被要求使用某种比例来回答,在这个例子中从 1 到 3。我的范围是计算每个子问题的相对频率,每个响应。所以,我使用了这个函数:

multichoice<-function(data, question.prefix){
  index<-grep(question.prefix, names(data))    # identifies the index for the available options in Q.12
  cases<-length(index)                # The number of possible options / columns 

  # Identify the range of possible answers for each question 
  # Step 1. Search for the min in each col and across each col choose the min
  # step 2. Search for the max in each col and across each col choose the max 

  mn<-min(data[,index[1:cases]], na.rm=T)
  mx<-max(data[,index[1:cases]], na.rm=T)
  d = colSums(data[, index] != 0, na.rm = TRUE)  # The number of elements across column vector, that are different from zero. 

  vec<-matrix(,nrow=length(mn:mx),ncol=cases)

  for(j in 1:cases){
    for(i in mn:mx){
      vec[i,j]=sum(data[, index[j]] == i, na.rm = TRUE)/d[j]  # This stores the relative responses for option j for the answer that is i
    }
  }

  vec1<-as.data.frame(vec)
  names(vec1)<-names(data[index])
  vec1<-t(vec1)
  return(vec1)
}

调用,我得到所需数据帧的函数。

q1  <- as.data.frame(multichoiceq4(df,"^Q1")) 
head(q1)

                     V1  V2        V3
Q1.a-Some Text 0.3333333 0.5 0.1666667
Q1.b-Some Text 0.3333333 0.5 0.1666667
Q1.c-Some Text 0.3333333 0.5 0.1666667

这表明对于选项“a”,33% 的参与者回答 1,50% 回答 2 等等......

我的问题

我想计算,相同但以类别为条件。所以,我想看看基于category1, category2 的相对频率如何。有人可以建议我如何做到这一点吗?

【问题讨论】:

    标签: r data-manipulation survey data-management


    【解决方案1】:

    我认为您可以通过将数据保持为长格式(即不要使用df&lt;-df %&gt;% spread(qs,Ans))并使用dplyr 来使您的代码更加灵活,例如:

    这部分基本上再现了您的 multichoice 函数的功能:

    df %>% 
        group_by(qs,Ans) %>% 
        summarize(total=n()) %>% 
        filter(!is.na(Ans)) %>% 
        mutate(frac=total/sum(total)) %>% 
        dcast(qs~Ans,value.var='frac')
    #               qs         1   2         3
    # 1 Q1.a-Some Text 0.3333333 0.5 0.1666667
    # 2 Q1.b-Some Text 0.3333333 0.5 0.1666667
    # 3 Q1.c-Some Text 0.3333333 0.5 0.1666667
    

    这个例子给出了一个如何修改它以考虑类别的例子。

    df %>% 
        group_by(qs,Category.1,Ans) %>% 
        summarize(total=n()) %>% 
        filter(!is.na(Ans)) %>% 
        mutate(frac=total/sum(total)) %>% 
        dcast(qs~Ans+Category.1,value.var='frac')
    #               qs   1_Cat 1   1_Cat 2   2_Cat 1   2_Cat 2   3_Cat 2
    # 1 Q1.a-Some Text 0.3333333 0.3333333 0.6666667 0.3333333 0.3333333
    # 2 Q1.b-Some Text 0.3333333 0.3333333 0.6666667 0.3333333 0.3333333
    # 3 Q1.c-Some Text 0.3333333 0.3333333 0.6666667 0.3333333 0.3333333
    

    【讨论】:

    • 这真的很酷,但我对如何阅读第二张表有点困惑。例如,在第一个中,很明显行加起来必须达到 100%,并且解释是即时的 - Q1.a 的 0.33% 响应为 1,50% 响应为 2 等等。然而,关于第二张桌子,我是不是有点迷茫了。
    • 在标题中,下划线前的值显示问题编号,下一个值显示类别。如果您展示了预期输出的示例,我可以帮助您处理表格
    • 谢谢您,基本上我希望我的表格看起来有某种方式,即行广告最多 100% 或列 - 取决于更方便的方式,如果需要根据需要拆分表格到不同的类别那么它也很好。例如,在第二个表中,如果将响应的第一列与第三列相加,就会发生这种情况,因为这显示了该类别对选项 a、b 和 c 的响应方式,并且它们的总和确实达到了 100%。跨度>
    • 您能否帮我列出第二组结果中的表格 - 即当考虑到类别时 - 以按照类别集排列列的方式查看。所以,我想首先拥有 1_Cat 1、2_ Cat 1、1_ Cat 2、2_Cat 2 等
    • 尝试在group_by更改订单,即group_by(qs,Ans,Category.1)
    猜你喜欢
    • 2013-09-24
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多