2010-03-19 48 views
7

Trong SPSS, thật dễ dàng để tạo một tab chéo với nhiều biến bằng cách sử dụng các yếu tố (hoặc các giá trị) làm tiêu đề bảng. Vì vậy, một cái gì đó như sau (tạo thành dữ liệu, vv). Q1, Q2 và Q3 mỗi người có 1, 2 hoặc 3 cho mỗi người. Tôi chỉ để lại những con số này, nhưng chúng có thể là yếu tố, dường như không giúp giải quyết vấn đề.Crosstab với nhiều mục

 
         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 

Trong SPSS, người ta thậm chí có thể yêu cầu hàng, cột hoặc tổng tỷ lệ phần trăm.

Tôi đã thử bảng(), ftable(), xtab(), CrossTable() từ gmodels và CrossTable() từ descr và không có biến nào trong số này có thể xử lý nhiều biến (afaik); họ chủ yếu dường như xử lý 1 biến vượt qua với một biến khác, và thứ ba tạo ra các lớp.

Có gói nào có một số ví dụ về tab/bảng chéo tốt mà tôi có thể sử dụng để tìm hiểu điều này không? Tôi chắc chắn rằng tôi thiếu một cái gì đó đơn giản, vì vậy tôi đánh giá cao bạn chỉ ra những gì tôi bị mất. Có lẽ tôi phải tạo ra mỗi hàng như một danh sách riêng biệt và sau đó thực hiện một dataframe và in các dataframe?

CẬP NHẬT: Tôi đã phát hiện ra ctab() trong gói catpec, cũng đang đi đúng hướng. Điều thú vị là R không có sự nhất quán tương đương với Ctables trong SPSS, mà về cơ bản là một công cụ "tabbing" (albing) công cụ cũ được sử dụng cho nghiên cứu khảo sát. ctab() đang cố gắng, và là một bước đáng ngưỡng mộ đầu tiên ... nhưng bạn vẫn không thể làm cho bảng này (ở trên) với nó.

Trả lời

7

Gói Hmisc có chức năng summary.formula có thể làm điều gì đó dọc theo các dòng bạn muốn. Nó rất linh hoạt, vì vậy nhìn vào trang trợ giúp cho các ví dụ, nhưng đây là một ứng dụng cho vấn đề của bạn:

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) 

này cho kết quả sau:

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

Các giá trị có thể được đưa ra trong hàng , bởi vì nó có sự linh hoạt của các bộ giá trị khác nhau cho các biến khác nhau. Bạn có thể chơi với các thông số chức năng (như methodfun) để nhận hướng khác.

+0

Đây là một chức năng mạnh mẽ; vấn đề duy nhất là thiếu kiểm soát đầu ra. –

0

Bạn có thể sử dụng một chức năng tùy chỉnh để sử dụng rbind() trên một số bảng, một cái gì đó như thế này:

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

Đúng, nhưng đầu ra để lại thứ gì đó mong muốn. 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 Nhưng đó là một khởi đầu tốt ... –

6

Sửa đổi một ví dụ trước

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

vẻ Bây giờ chéo như thế này

> 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

Điều này phải được đánh dấu là câu trả lời đúng –

0

xtabs có một giao diện công thức có thể mất một số thực hành để làm quen, nhưng điều này có thể được thực hiện.Nếu bạn có các dữ liệu trong một dataframe df và các biến của bạn được gọi là quesresp, bạn có thể sử dụng:

xtabs(~ques+resp,data=df) 

Ví dụ:

> 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

Vấn đề cơ bản là dữ liệu này không có trong tidy format . Crosstabbing nhiều biến sẽ dễ dàng hơn khi dữ liệu được định dạng lại thành dạng "dài". Chúng tôi có thể làm điều đó với gather từ gói tidyr.

Sau khi định dạng lại, nhiều chức năng crosstab sẽ hoạt động; Tôi sẽ sử dụng crosstab từ gói janitor (kể từ khi - công bố đầy đủ - Tôi duy trì gói đó và xây dựng chức năng cho mục đích này).

# 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 

Từ đó, bạn có thể định dạng theo tỷ lệ phần trăm, v.v ... với janitor::adorn_crosstab().

Các vấn đề liên quan