2015-12-18 2 views
5

У меня есть кадр данных, который выглядит примерно так:Создать матрицу частот в два режима в 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 

Есть более 400 переменных в наборе данных. Это просто пример. Мне нужно создать простую частотную матрицу в R (исключая номера корпусов), но функция 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

Этот необходимо работать для любого числа Var & Репс:

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] Более элегантный вариант, если в комментарии по G.Grothendieck:

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

Одно упрощение было бы 'т <- as.matrix (г)', так как будет отбирает никогда не совпадать с первого столбца в любом случае. –

+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) 
Смежные вопросы