2010-03-19 3 views
7

В 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) несколько переменных; они в основном, похоже, обрабатывают 1 переменную, скрещенную с другой переменной, а третий создает слои.

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

UPDATE: Я обнаружил ctab() в пакете catspec, который также находится на правильном пути. Интересно, что R не имеет согласованного эквивалента Ctables в SPSS, который в основном является инструментом «tabbing», а также старыми инструментами табуляции, используемыми для исследовательских исследований. ctab() пытается и является замечательным первым шагом ... но вы все равно не можете сделать эту таблицу (выше) с ней.

ответ

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)| 
+------+-------+ 

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

+0

Это мощная функция; единственной проблемой является отсутствие контроля над выходом. –

0

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

multitab <- function(...){ 
    tabs<-list(...) 
    tablist<-lapply(tabs,table) 
    bigtab<-t(sapply(tablist,rbind)) 
    bigtab } 
+0

Правда, но выход оставляет желать лучшего. 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 Но это хороший старт ... –

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 
+0

Это должно быть отмечено как правильный ответ –

0

xtabs имеет формулу интерфейс, который может потребоваться некоторая практика, чтобы привыкнуть, но это может быть сделано.Если у вас есть данные в dataframe 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

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

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

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

Смежные вопросы