2015-12-18 19 views
5

Tôi có khung dữ liệu, mà trông giống như sau:Tạo một ma trận tần số hai chế độ trong R

CASENO Var1 Var2 Resp1 Resp2 
1   1  0  1  1 
2   0  0  0  0 
3   1  1  1  1 
4   1  1  0  1 
5   1  0  1  0 

Hiện có hơn 400 biến trong dataset. Đây chỉ là một ví dụ. Tôi cần phải tạo một ma trận tần số đơn giản trong R (không bao gồm số trường hợp), nhưng chức năng table không hoạt động. Cụ thể, tôi đang tìm cách chéo bảng một phần của các cột để tạo ma trận tần số hai chế độ. Bảng sẽ trông như thế này:

 Var1 Var2 
Resp1 3  1 
Resp2 3  2 

Trong Stata, lệnh này là:

gen var = 1 if Var1==1 
replace var= 2 if Var2==1 

gen resp = 1 if Resp1==1 
replace resp = 2 if Resp2==1 

tab var resp 

Trả lời

5

này người ta nên làm việc cho bất kỳ số lượng của Var & Resps:

d <- structure(list(CASENO = 1:5, Var1 = c(1L, 0L, 1L, 1L, 1L), Var2 = c(0L, 0L, 1L, 1L, 0L), Resp1 = c(1L, 0L, 1L, 0L, 1L), Resp2 = c(1L, 0L, 1L, 1L, 0L)), .Names = c("CASENO", "Var1", "Var2", "Resp1", "Resp2"), class = "data.frame", row.names = c(NA, -5L)) 

m <- as.matrix(d[,-1]) 
m2 <- t(m) %*% m 
rnames <- grepl('Resp',rownames((m2))) 
cnames <- grepl('Var',colnames((m2))) 
m2[rnames,cnames] 

[UPDATE] Một phiên bản thanh lịch hơn, với điều kiện trong các bình luận của G.Grothendieck:

m <- as.matrix(d[,-1]) 
cn <- colnames(m); 
crossprod(m[, grep("Resp", cn)], m[, grep("Var", cn)]) 
+2

Một đơn giản hóa hơn nữa sẽ được 'm <- as.matrix (d)' kể từ khi greps sẽ không bao giờ phù hợp với cột đầu tiên anyways. –

+0

Cảm ơn bạn! Điều này rất hữu ích. Làm cách nào để tôi tham chiếu số cột, chứ không phải tên cột, sử dụng lệnh crossprod? – jj987246

+0

@ jj987246, chỉ cần sử dụng các vectơ chứa số cột, ví dụ: 'crossprod (m [, 1: 4], m [, 5: 8])' –

4

tôi chắc chắn rằng có một cách khác, nhưng bạn có thể làm điều này:

library(reshape2) 
library(plyr) 

df1 <- melt(df[,-1],id=1:2) 
ddply(df1,.(variable),summarize, 
     Var1 = sum(value==1&Var1==1), 
     Var2 = sum(value==1&Var2==1)) 

# variable Var1 Var2 
# 1 Resp1 3 1 
# 2 Resp2 3 2 
3

Dưới đây là một cách tiếp cận sử dụng xtabs.

# get names of non "variables" 
not_vars <- c("Resp1", "Resp2", "CASENO") 

# get names of "variables" 
vars <- as.matrix(d[,!names(d) %in% not_vars]) 

# if you have many more than 2 response variables, this could get unwieldy 
result <- rbind(
    xtabs(vars ~ Resp1, data=d, exclude=0), 
    xtabs(vars ~ Resp2, data=d, exclude=0)) 

# give resulting table appropriate row names.  
rownames(result) <- c("Resp1", "Resp2") 
#  Var1 Var2 
#Resp1 3 1 
#Resp2 3 2 

dữ liệu mẫu:

d <- read.table(text=" 
CASENO Var1 Var2 Resp1 Resp2 
1   1  0  1  1 
2   0  0  0  0 
3   1  1  1  1 
4   1  1  0  1 
5   1  0  1  0", header=TRUE) 
Các vấn đề liên quan