2015-12-18 19 views
5

bir iki modlu frekans matrisi oluşturun:Ben şuna benzer bir veri çerçevesi var R

veri kümesindeki 400'den fazla değişken vardı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 

. Bu sadece bir örnektir. R'de basit bir frekans matrisi oluşturmam gerekiyor (kasa numaraları hariç), ancak table işlevi çalışmıyor. Özellikle, iki modlu bir frekans matrisi oluşturmak için sütunların bir bölümünü çapraz tablolara ayırmak istiyorum.

Stata olarak, komut
 Var1 Var2 
Resp1 3  1 
Resp2 3  2 

: tablo bu gibi görünmelidir Ben başka bir yol olduğunu eminim

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 

cevap

5

Bu

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] 
012: bir Var & Solunum herhangi bir sayı için çalışması gerekir

[GÜNCELLEME] G.Grothendieck tarafından yorumda sağlanan daha zarif versiyonu:

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

bir basitleştirme 'm' olur - as.matrix (d) 'greps durumda ilk sütunu ile asla uyum sağlamayacak çünkü. –

+0

Teşekkür ederiz! Bu çok yararlı. Crossprod komutunu kullanarak sütun adlarını değil, sütun numaralarını nasıl referans gösterebilirim? – jj987246

+0

@ jj987246, sadece sütun numaralarını içeren vektörleri kullanın, örn. 'Crossprod (m, [1, 4], m [5, 8]) ' –

4

ama bunu yapabilirdi:

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

İşte xtabs kullanan bir yaklaşımdır.

# 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 

örnek veriler:

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) 
İlgili konular