多项交叉表

10
在SPSS中,使用因素(或值)作为表头,创建具有多个变量的交叉表相对容易。因此,像以下内容一样(虚构的数据等)。每个人的Q1、Q2和Q3中都有1、2或3。我只是把它们留成数字,但它们可以是因子,没有任何因素似乎能够帮助解决问题。
                        1(非常经常)   2(很少)   3(从未)
   Q1. 喜欢它              12             15          13
   Q2. 推荐它              22             11          10
   Q3. 使用过它            22             12          9
在SPSS中,甚至可以请求行、列或总百分比。
我已经尝试了来自gmodels的table()、ftable()、xtab()和CrossTable()以及来自descr的CrossTable(),但没有一个可以处理(afaik)多个变量;它们大多似乎处理与另一个变量交叉的1个变量,而第3个创建层。
是否有一个包含一些良好的交叉表/表格示例的软件包,我可以用来弄清楚这个问题?我相信我错过了一些简单的东西,所以感谢您指出我错过的内容。也许我必须将每一行作为单独的列表生成,然后制作数据框并打印数据框?
更新:我现在已经发现了包catspec中的ctab(),这也是正确的方向。有趣的是,R没有与SPSS中的Ctables相对应的一致性等效工具,它基本上是一种类似于用于调查研究的旧制表工具的“制表”工具。ctab()正在尝试,并且是一个令人钦佩的第一步...但您仍然不能使用它创建此表(上面的表)。
7个回答

7

Hmisc包有summary.formula函数,可以做一些你想要的事情。它非常灵活,因此请查看帮助页面以获取示例,但这里是一个应用于你问题的例子:

library(Hmisc)
dd <- data.frame(Q1=sample(1:3, 20, replace=T), Q2=sample(1:3, 20, replace=T), 
                 Q3=sample(1:3, 20, replace=T))  #fake data
summary(~Q1+Q2+Q3, data=dd, fun=table)

这将产生以下结果:
 Descriptive Statistics  (N=20)

 +------+-------+
 |      |       |
 +------+-------+
 |Q1 : 1|25% (5)|
 +------+-------+
 |    2 |45% (9)|
 +------+-------+
 |    3 |30% (6)|
 +------+-------+
 |Q2 : 1|30% (6)|
 +------+-------+
 |    2 |35% (7)|
 +------+-------+
 |    3 |35% (7)|
 +------+-------+
 |Q3 : 1|35% (7)|
 +------+-------+
 |    2 |30% (6)|
 +------+-------+
 |    3 |35% (7)|
 +------+-------+

可能的值以行形式给出,因为它具有不同变量的不同值集的灵活性。您可以尝试调整函数参数(如methodfun)来获取其他方向。

这是一个强大的函数;唯一的问题是缺乏对输出的控制。 - Michael Wexler

6
修改之前的例子
library(Hmisc)
library(plyr)
dd <- data.frame(q1=sample(1:3, 20, replace=T),
 q2=sample(1:3, 20, replace=T), 
 q3=sample(1:3, 20, replace=T))  #fake data

cross <- ldply(describe(dd), function(x) x$values[1,])[-1]

rownames(cross) <- c("Q1. Likes it","Q2. Recommends it","Q3. Used it")
names(cross) <- c("1 (very Often)","2 (Rarely)","3 (Never)")

现在的交叉看起来像这样。
> cross
                  1 (very Often) 2 (Rarely) 3 (Never)
Q1. Likes it                   4         10         6
Q2. Recommends it              7          9         4
Q3. Used it                    6          4        10

4
根本问题在于这些数据不符合整洁数据格式,将多个变量交叉制表会更容易,当数据被重塑成“长”形式时。我们可以使用tidyr包中的gather来实现。
重塑后,许多交叉制表函数都可以使用;我将使用janitor包中的tabyl(因为 - 全部披露 - 我维护该包并为此目的构建了该功能)。
# Create reproducible sample data
set.seed(1)
possible_values <- c("1 (Very Often)", "2 (Rarely)", "3 (Never)")
some_values <- sample(possible_values, 100, replace = TRUE)
dat <- data.frame(Q1 = some_values[1:25], Q2 = some_values[26:50], 
                 Q3 = some_values[51:75], Q4 = some_values[76:100])

library(tidyr)
library(janitor)

dat %>%
  gather(question, response) %>% 
  tabyl(question, response)
#>   question 1 (Very Often) 2 (Rarely) 3 (Never)
#> 1       Q1              8          8         9
#> 2       Q2              4         11        10
#> 3       Q3              8         12         5
#> 4       Q4              7          7        11

从那里开始,您可以使用函数进行格式化,例如janitor :: adorn_percentages()


1

xtabs有一个公式接口,可能需要一些练习才能熟悉,但这是可以做到的。如果你的数据在一个数据框中df,并且你的变量被称为quesresp,你可以使用:

xtabs(~ques+resp,data=df)

例如:

> t1 <- rep(c("A","B","C"),5)
> t2 <- rpois(15,4)
> df <- data.frame(ques=t1,resp=t2)
> xtabs(~ques+resp,data=df)
     resp
names 2 3 4 5 6 7 9
    A 1 0 2 1 0 0 1
    B 1 0 0 2 1 1 0
    C 1 2 0 1 0 1 0

1

1

请查看来自packageepiDisplay中的tableStack()。我认为这可能是您正在寻找的内容。


0
你可以使用自定义函数来在多个表格上使用 rbind(),类似于以下内容:
multitab <- function(...){
   tabs<-list(...)
   tablist<-lapply(tabs,table)
   bigtab<-t(sapply(tablist,rbind))
   bigtab } 

真实,但输出还有待改善。x <- c(1,3,1,3,1,3,1,3,4,4); y <- c(2,4,1,4,2,4,1,4,2,4); z <- c(3,5,2,5,3,5,2,5,3,5) multitab(x,y,z) [,1] [,2] [,3] [1,] 4 4 2 [2,] 2 3 5 [3,] 2 3 5但这是一个不错的开始... - Michael Wexler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接