आर

2015-12-18 4 views
5

में एक दो मोड आवृत्ति मैट्रिक्स बनाएं मैं एक डेटा फ्रेम, जो कुछ इस तरह दिखता है:आर

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 

डाटासेट में 400 से अधिक चर रहे हैं। यह सिर्फ एक उदाहरण है। मुझे आर में एक साधारण आवृत्ति मैट्रिक्स बनाने की आवश्यकता है (केस संख्याओं को छोड़कर), लेकिन table फ़ंक्शन काम नहीं करता है। विशेष रूप से, मैं आवृत्तियों के दो-मोड मैट्रिक्स बनाने के लिए कॉलम के एक हिस्से को पार-सारणीबद्ध करना चाहता हूं। टेबल इस तरह दिखना चाहिए:

 Var1 Var2 
Resp1 3  1 
Resp2 3  2 

Stata में, यह आदेश है:

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 

उत्तर

5

यह किसी को भी & किसी भी संख्या के लिए काम करना चाहिए:

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] 

[अद्यतन] एक और अधिक सुरुचिपूर्ण संस्करण, G.Grothendieck द्वारा टिप्पणी में उपलब्ध कराई गई:

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

आगे सरलीकरण होगा 'मी <- as.matrix (घ)' के बाद से greps पहले कॉलम वैसे भी मेल खाते हैं कभी नहीं होगा। –

+0

धन्यवाद! यह बहुत उपयोगी है। Crossprod कमांड का उपयोग करते हुए, कॉलम नामों के बजाय, कॉलम संख्याओं का संदर्भ कैसे दूंगा? – jj987246

+0

@ jj987246, केवल कॉलम संख्या वाले वैक्टर का उपयोग करें, उदा। 'Crossprod (एम [, 1: 4], मी [, 5: 8])' –

4

मैं वहाँ एक और तरीका है यकीन है, लेकिन आप ऐसा कर सकता है:

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

यहाँ 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 <- 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)