2017-12-11 27 views
0

나는 음수가 아닌 값과 y_1, ..., y_p라는 이름의 컬럼 만 갖는 nxp 매우 희박한 카운트 매트릭스를 가지고 있습니다. (n = 2 million and p = 70)카운트 매트릭스에서 인접 매트릭스를 얻는 방법

R을 사용하여 y_i와 y_j가 같은 행에 0이 아닌 값을 갖는 횟수를 계산하는 행렬로 변환하려고합니다.

예 :

ID a b c d e 
1 1 0 1 0 0 
2 0 1 1 0 0 
3 0 0 1 1 0 
4 1 1 0 0 0 

내가 가져올 :

- a b c d e 
a 2 1 1 0 0 
b 1 2 1 0 0 
c 1 1 3 1 0 
d 0 0 1 1 0 
e 0 0 0 0 0 
+0

작은 재현 가능한 예를 게시 할 수 있습니까? 복사/붙여 넣기가 가능한 것이 가장 좋습니다. 샘플 입력을 생성하기 위해 코드를 공유하십시오 ('dput()'이 유용 할 수 있습니다). 그리고 그 입력에 대해 원하는 출력을 보여줍니다. – Gregor

+0

확실합니다. 방금 게시했습니다. 감사합니다 – user40076

답변

1

이 간단한 매트릭스 곱셈이다.

m = read.table(text = "ID a b c d e 
1 1 0 1 0 0 
2 0 1 1 0 0 
3 0 0 1 1 0 
4 1 1 0 0 0", header = T) 
m = as.matrix(m[, -1]) 

이 단지 1과 0 인 원래의 행렬에 의존한다 :

t(m) %*% m 
    a b c d e 
a 2 1 1 0 0 
b 1 2 1 0 0 
c 1 1 3 1 0 
d 0 0 1 1 0 
e 0 0 0 0 0 

이 데이터를 사용. 그렇지 않은 경우, 당신은 m = original_matrix > 0 여기


가 당신 같은 행렬에 일하고있어 그것을 만들 수 있습니다 설명 : 내 노트북에

library(Matrix) 
nr = 2e6 
nc = 70 
mm = Matrix(0, nrow = nr, ncol = nc, sparse = T) 

# make, on average, three 1s per row 
set.seed(47) 
mm[cbind(sample(nr, size = 3 * nr, replace = T), sample(nc, size = 3 * nr, replace = T))] = 1 

system.time({res = t(mm) %*% mm}) 
    # user system elapsed 
    # 0.836 0.057 0.895 
format(object.size(res), units = "Mb") 
[1] "0.1 Mb 

는 계산이 초 미만 소요되며 결과는 약 0.1 Mb.

+0

곱셈을 계산할 수 없습니다 (크기 1.2GB의 벡터를 할당 할 수 없음). 초기 초기 행렬은 2 백만 분의 70입니다. – user40076

+0

결과로 70x70 행렬을 예상합니다. 그리고 내 초기 매트릭스는 매우 드문 드문, 평균은 행당 3 개의 값입니다. – user40076

+0

오, 예, 행과 열이 바뀌 었습니다. 그것은 희소 매트릭스 객체입니까? 그것은 사실상 문제가되지 않습니다. – Gregor