Кросс-таблица с несколькими элементами - PullRequest
7 голосов
/ 19 марта 2010

В SPSS (сравнительно) легко создать перекрестную таблицу с несколькими переменными, используя факторы (или значения) в качестве заголовка таблицы. Итак, что-то вроде следующего (составленные данные и т. Д.). Каждый Q1, Q2 и Q3 имеют 1, 2 или 3 для каждого человека. Я просто оставил их как числа, но они могли быть факторами, но ни один из них не помог решить проблему.

                        1 (very Often)   2 (Rarely)   3 (Never)
   Q1. Likes it           12              15             13
   Q2. Recommends it      22              11             10
   Q3. Used it            22              12             9

В SPSS можно даже запросить строку, столбец или общий процент.

Я пробовал table (), ftable (), xtab (), CrossTable () из gmodels и CrossTable () из descr, и ни одна из них не может обрабатывать (afaik) несколько переменных; в основном они обрабатывают одну переменную, пересеченную с другой переменной, а третья создает слои.

Есть ли пакет с несколькими хорошими примерами кросс-табуляции / таблиц, которые я мог бы использовать, чтобы понять это? Я уверен, что упускаю что-то простое, поэтому я ценю, что вы указали на то, что я пропустил. Возможно, мне нужно сгенерировать каждую строку в виде отдельного списка, а затем создать фрейм данных и распечатать фрейм данных?

ОБНОВЛЕНИЕ: Теперь я обнаружил ctab () в пакете catspec, который также находится на правильном пути. Интересно, что R не имеет последовательного эквивалента Ctables в SPSS, который по сути является инструментом «табуляции», а не старыми инструментами табулирования, которые использовались для исследования опроса. ctab () пытается, и это замечательный первый шаг ... но вы все еще не можете сделать эту таблицу (выше) с ней.

Ответы [ 7 ]

7 голосов
/ 19 марта 2010

Пакет 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)|
 +------+-------+

Возможные значения приведены в строках, потому что он имеет гибкость различных наборов значений для разных переменных. Возможно, вы сможете поиграть с параметрами функции (например, method и fun), чтобы получить другое направление.

6 голосов
/ 22 марта 2010

Изменение предыдущего примера

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
2 голосов
/ 12 января 2017

Основная проблема заключается в том, что эти данные не в аккуратном формате .Кросс-таблица нескольких переменных будет легче, когда данные преобразуются в «длинную» форму.Мы можем сделать это с помощью gather из пакета tidyr.

После изменения формы многие функции кросс-таблицы будут работать;Я буду использовать tabyl из пакета janitor (поскольку - полное раскрытие - я поддерживаю этот пакет и построил функцию для этой цели).

# 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 голос
/ 22 марта 2010

xtabs имеет интерфейс формулы, к которому можно привыкнуть, но это можно сделать. Если у вас есть данные в кадре данных df и ваши переменные называются ques и 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
1 голос
/ 20 марта 2010

просто проверьте Хэдли Уикхем измените пакет . AFAIS, вам нужна функция cast из пакета.

0 голосов
/ 11 мая 2018

Выезд tableStack() из пакета epiDisplay . Я думаю, что это может быть то, что вы ищете.

0 голосов
/ 19 марта 2010

Вы можете использовать пользовательскую функцию для использования rbind() в нескольких таблицах, что-то вроде этого:

multitab <- function(...){
   tabs<-list(...)
   tablist<-lapply(tabs,table)
   bigtab<-t(sapply(tablist,rbind))
   bigtab } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...