2012-10-11 2 views
2

저는 동시 발생 행렬을 채울 수있는 빠르고 효율적인 방법을 찾고 있습니다. 여기서 I는 작업하고있는 데이터의 예이다 :공존 행렬 채우기

col1 col2 
a e  
a f  
a e  
b f  
c g  
a e  
d f  
a e  
a g  
b e  
c e 

및 I는 다음과 같은 형식의 매트릭스 원한다

... e... f... g  
a  
b  
c  
d 

주파수에 관련된 대응하는 엔트리로한다.

예를 들어, 행렬의 요소 (3,1)은 (c, e)의 공존 빈도에 해당하며 값은 1이어야하고 (1,1)의 값은 값을 가져야합니다 (a, e)의 3 개의 엔트리에 대응하는도 3에 도시되어있다.

현재 두 개의 for 루프를 사용하여 항목을 개별적으로 계산하고 있고 행렬을 계산하는 데 오랜 시간이 걸립니다 (실제 데이터에는 약 백만 행이 있음).

+2

스파 스 매트릭스, 당신에게 비 스파 스 –

답변

1

당신은 정확하게 당신이 필요로 할 sparse를 사용할 수 있습니다

spA = sparse(data(:,1), data(:,2), 1); 

data가 데이터입니다

하지만, 같은 번호를. 따라서 알파벳 문자를 먼저 double로 변환해야합니다.

희소 조합 data(:,1)data(:,2)의 행/열 쌍을 조합하여 모든 쌍을 한 개씩 추가합니다. 그러나 행렬이 대칭이 될 것으로 예상되는 경우 데이터에 따라 spA과 그 전 환을 합해야 할 수도 있습니다.

+0

+1 특히 그들이 변환 단서를 제공 할 수 있습니다. 그러나 작은 주석 :'sparse'는 데이터 타입을 자동적으로 변환합니다; 수동 변환이 필요 없습니다. –

+0

@RodyOldenhuis 실제로 그렇습니다. 그러나'a'가 97이기 때문에 드문 드문 행렬은 빈 시작을 가지게되고 행/열 97에서만 실제로 시작됩니다. – angainor

+0

모두 도와 주셔서 감사합니다. – user1737564

2

table와 R의 솔루션입니다 : 천재 :

df <- read.table(text="col1 col2 
a e  
a f  
a e  
b f  
c g  
a e  
d f  
a e  
a g  
b e  
c e", header = TRUE) 

table(df) 

    col2 
col1 e f g 
    a 4 1 1 
    b 1 1 0 
    c 1 0 1 
    d 0 1 0