8

在 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)多个变量;他们似乎主要处理一个与另一个变量交叉的变量,第三个创建层。

是否有一个包含一些好的交叉表/表格示例的包,我可以用它来解决这个问题?我确定我错过了一些简单的东西,所以我很感激你指出我错过了什么。也许我必须将每一行生成为一个单独的列表,然后制作一个数据框并打印数据框?

更新:我现在在包 catspec 中发现了 ctab(),它也在正确的轨道上。有趣的是,R 与 SPSS 中的 Ctables 没有一致的等价物,后者基本上是一种“制表”工具,就像用于调查研究的旧制表工具一样。ctab() 正在尝试,并且是令人钦佩的第一步......但你仍然不能用它来制作这张桌子(上图)。

4

7 回答 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)来获得另一个方向。

于 2010-03-19T18:45:36.047 回答
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
于 2010-03-22T16:47:26.440 回答
3

根本问题是这些数据的格式不整齐。当数据被重新塑造成“长”形式时,对多个变量进行交叉制表会更容易。我们可以gather从 tidyr 包中做到这一点。

重塑后,许多交叉表功能将起作用;我将从tabyljanitor 包中使用(因为 - 完全公开 - 我维护该包并为此目的构建了该功能)。

# 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().

于 2017-01-12T02:11:31.457 回答
1

xtabs有一个公式界面,需要一些练习才能习惯,但这是可以做到的。如果您在数据框中有数据df并且您的变量被称为quesand resp,您可以使用:

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
于 2010-03-22T17:16:45.690 回答
1

只需检查Hadley Wickham 的 重塑包。AFAIS,您需要cast包中的功能。

于 2010-03-19T23:27:02.060 回答
1

tableStack()epiDisplay 包裹中签出。我想这可能是你正在寻找的。

于 2018-05-11T17:16:50.480 回答
0

您可以使用自定义函数rbind()在多个表上使用,如下所示:

multitab <- function(...){
   tabs<-list(...)
   tablist<-lapply(tabs,table)
   bigtab<-t(sapply(tablist,rbind))
   bigtab } 
于 2010-03-19T20:41:14.970 回答