2015-04-14 14 views
8

Jestem względnie nowa w R, więc wybacz mi to, co uważam za stosunkowo proste pytanie.Matryca generująca i podsumowująca

Mam dane w postaci

1 2 3 4 5 
A 0 1 1 0 0 
B 1 0 1 0 1 
C 0 1 0 1 0 
D 1 0 0 0 0 
E 0 0 0 0 1 

gdzie A-E są ludzie i 1-5 są pliki binarne, czy nie mają tej jakości. Muszę wykonać macierz A-E, w której komórka A, B = 1, jeśli suma dowolnej jakości 1-5 dla A & B wynosi 2 (jeśli mają co najmniej jedną jakość). Proste 5x5 będzie:

A B C D E 
A 1    
B 1 1   
C 1 0 1  
D 0 1 0 1 
E 0 1 0 0 1 

Następnie muszę zsumować całą macierz. (Powyżej będzie 9). Mam tysiące obserwacji, więc nie mogę tego zrobić ręcznie. Jestem pewien, że jest kilka łatwych linii kodu, po prostu nie jestem wystarczająco doświadczony.

Dzięki!

EDYCJA: Zaimportowałem dane z pliku .csv z kolumnami (1-5 powyżej) jako zmiennymi, w rzeczywistych danych mam 40 zmiennych. A-E to unikalne spostrzeżenia ID ludzi, około 2000 roku. Chciałbym również wiedzieć, jak najpierw przekształcić to w matrycę, aby wykonać wspaniałe odpowiedzi, które już dostarczyłeś. Dzięki!

Odpowiedz

6

Można użyć Mnożenie macierzy tutaj

out <- tcrossprod(m) 
# A B C D E 
# A 2 1 1 0 0 
# B 1 3 0 1 1 
# C 1 0 2 0 0 
# D 0 1 0 1 0 
# E 0 1 0 0 1 

następnie ustaw po przekątnej do jednego, jeśli jest to wymagane

diag(out) <- 1 

Jak Davida zwraca uwagę w komentarzach tcrossprod Jest to w zasadzie robi m %*% t(m)

Kilka sposobów ich obliczania przez sum l Oto jeden

sum(out[upper.tri(out, diag=TRUE)] , na.rm=TRUE) 
+0

Dziękujemy! Rozumiem to i powinno działać, ale muszę zadać łatwiejsze pytanie, teraz mam dane jako zmienne. Jak mogę zmienić to w macierz bez konieczności wpisywania wszystkich liczb? – ChrisDH

+0

Nie ma za co. Jeśli masz każdy wiersz, możesz użyć 'rbind', aby połączyć je wszystkie razem i utworzy' matrycę'. W przeciwnym razie, jeśli twoje dane to 'data.frame', możesz użyć' as.matrix'. Jeśli któryś z nich nie działa, możesz dodać małą zmianę do swojego pytania, pokazując w jaki sposób dane są przechowywane, dzięki – user20650

+0

Dzięki, dodałem powyższą edycję. Zaimportowałem dane z pliku .csv z kolumnami (1-5 powyżej) jako zmiennymi, w prawdziwych danych mam 40 zmiennych. A-E to unikalne spostrzeżenia ID ludzi, około 2000 roku. Chciałbym również wiedzieć, jak najpierw przekształcić to w matrycę, aby wykonać wspaniałe odpowiedzi, które już dostarczyłeś. – ChrisDH

1

Można użyć outer, jeśli m to macierz kwadratowa:

f = Vectorize(function(u,v) any(colSums(m[c(u,v),])>1)+0L) 

res = outer(1:ncol(m), 1:ncol(m), FUN=f) 
colnames(res) = row.names(res) = rownames(m) 

# A B C D E 
#A 1 1 1 0 0 
#B 1 1 0 1 1 
#C 1 0 1 0 0 
#D 0 1 0 1 0 
#E 0 1 0 0 1 

danych:

m = structure(c(0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 
1, 0, 0, 0, 1, 0, 0, 1), .Dim = c(5L, 5L), .Dimnames = list(c("A", 
"B", "C", "D", "E"), NULL)) 
1

Co na ten temat? (z kursem nie tak eleganckim jak rozwiązanie tcrossprod):

d <- dim(m) 
ind <- expand.grid(1:d[1],1:d[1]) 
M <- matrix(as.numeric(apply(cbind(m[ind[,2],],m[ind[,1]]), 1, 
+ function(x) sum(x[1:d[1]] == 1 & x[(d[1]+1):(d[1]*2)] == 1) >=1)), ncol = d[1]) 

rownames(M) = colnames(M) = rownames(m) 
M 
    A B C D E 
A 1 1 1 0 0 
B 1 1 0 1 1 
C 1 0 1 0 0 
D 0 1 0 1 0 
E 0 1 0 0 1 
Powiązane problemy