交叉制表多个回答问题 [英] Cross tabulate multiple response questions

查看:93
本文介绍了交叉制表多个回答问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要通过分组变量交叉列出多个响应(存储为一组变量)。我的调查问题是:您有以下哪些水果?然后,给来自地理区域1或区域2的受访者一个带有 1.橙色,2。芒果...的列表,根据是(1)或否(0)问题得出的数据为:

I need to cross tabulate multiple responses (stored as a set of variables) by a grouping variable. My survey question is: "Which of the following fruits have you had?" The respondent from either geographical Area 1 or Area 2 is then given a list with "1. Orange, 2. Mango, ..." and the resulting data from the yes (1) or no (0) questions is:

set.seed(1)
df <- data.frame(area=rep(c('Area 1','Area 2'), each=6),
                 var_orange=sample(0:1, 12, T),
                 var_banana=sample(0:1, 12, T),
                 var_melon=sample(0:1, 12, T),
                 var_mango=sample(0:1, 12, T))

     area var_orange var_banana var_melon var_mango
1  Area 1          0          1         0         1
2  Area 1          0          0         0         0
3  Area 1          1          1         0         1
4  Area 1          1          0         0         0
5  Area 1          0          1         1         1
6  Area 1          1          1         0         1
7  Area 2          1          0         0         1
8  Area 2          1          1         1         1
9  Area 2          1          1         0         1
10 Area 2          0          0         0         1
11 Area 2          0          1         1         0
12 Area 2          0          0         1         0

我想获得一个在Stata中生成的摘要输出:

I would like to get an summary output like this generated in Stata:

            |          area          
            |     Area 1      Area 2 |      Total
------------+------------------------+-----------
 var_orange |      50.00       50.00 |      50.00 
 var_banana |      66.67       50.00 |      58.33 
  var_melon |      16.67       50.00 |      33.33 
  var_mango |      66.67       66.67 |      66.67 
------------+------------------------+-----------
      Total |     200.00      216.67 |     208.33

我发现了一个相关的发布,并带有多频函数,该函数可对我的数据进行单向汇总:

I found a related post with a multfreqtable function which gives a one-way summary for my data:

multfreqtable = function(data, question.prefix) {
  z = length(question.prefix)
  temp = vector("list", z)

  for (i in 1:z) {
    a = grep(question.prefix[i], names(data))
    b = sum(data[, a] != 0)
    d = colSums(data[, a] )
    e = sum(rowSums(data[,a]) !=0)
    f = as.numeric(c(d, b))
    temp[[i]] = data.frame(question = c(sub(question.prefix[i], 
                                            "", names(d)), "Total"),
                           freq = f,
                           percent_response = (f/b)*100,
                           percent_cases = round((f/e)*100, 2))
    names(temp)[i] = question.prefix[i]
  }
  temp
}

multfreqtable(df, "var_")

$var_
  question freq percent_response percent_cases
1   orange    6               24         54.55
2   banana    7               28         63.64
3    melon    4               16         36.36
4    mango    8               32         72.73
5    Total   25              100        227.27

但是我对双向总结感兴趣。

But I am interested in a two-way summary.

我可以按照建议使用 dplyr 发布并获取:

I could use dplyr as suggested in a post and get:

df %>%
  summarise(orange_pct=round(sum(var_orange,na.rm=TRUE)*100/n(),2), 
            banana_pct=round(sum(var_banana,na.rm=TRUE)*100/n(),2),
            melon_pct=round(sum(var_melon,na.rm=TRUE)*100/n(),2),
            mango_pct=round(sum(var_mango,na.rm=TRUE)*100/n(),2)) 

 orange_pct banana_pct melon_pct mango_pct
1         50      58.33     33.33     66.67

但是我需要整洁的表输出和边际列频率。

But I need a neater table output with marginal column frequencies.

推荐答案

您可以先使用 dplyr 计算值,然后将其放入在表中使用例如 knitr :: kable

You could first calculate the values using dplyr, then put them in a table using e.g. knitr::kable.

library(dplyr)
library(knitr)

set.seed(1)
df <- data.frame(area = rep(c('Area 1','Area 2'), each = 6),
                 var_orange = sample(0:1, 12, T),
                 var_banana = sample(0:1, 12, T),
                 var_melon = sample(0:1, 12, T),
                 var_mango = sample(0:1, 12, T))

t1 <- df %>% group_by(area) %>% summarise_each(funs(mean))
t2 <- df %>% summarise_each(funs(mean))
kable(rbind(t1, t2))

|area   | var_orange| var_banana| var_melon| var_mango|
|:------|----------:|----------:|---------:|---------:|
|Area 1 |        0.5|  0.6666667| 0.1666667| 0.6666667|
|Area 2 |        0.5|  0.5000000| 0.5000000| 0.6666667|
|NA     |        0.5|  0.5833333| 0.3333333| 0.6666667|

进一步完善输出以模仿Stata的输出,

To further polish the output to mimick that from Stata:

polished <- 100 * rbind(t1, t2) %>%  # Use percentages
  select(-area) %>%                  # Drop "area"
  mutate(Total = rowSums(.[])) %>%   # Add Total
  as.matrix %>% t

kable(polished, digits = 2, col.names = c("Area 1", "Area 2", "Total"))

最终结果将是:

|           | Area 1| Area 2|  Total|
|:----------|------:|------:|------:|
|var_orange |  50.00|  50.00|  50.00|
|var_banana |  66.67|  50.00|  58.33|
|var_melon  |  16.67|  50.00|  33.33|
|var_mango  |  66.67|  66.67|  66.67|
|Total      | 200.00| 216.67| 208.33|

这篇关于交叉制表多个回答问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆