2014-10-20 2 views
2

소셜 네트워크 분석과 함께 특정 변수의 빈도를 분석하고자하므로 횡단면 데이터를 인접성 매트릭스로 변환하려고합니다. 경험적인 예가 논리에 도움이되는 경우 기본적으로 3 명으로 구성된 4 명에게 제시하는 것과 유사합니다. 0 ~ 3 개의 객체 중에서 선택할 수 있습니다. 나는 서로 다른 물체가 얼마나 일반적으로 선택되었는지 분석하고이를 선호도의 네트워크로 시각화하고 싶습니다.횡단면 데이터를 인접성 매트릭스로 변환 R

는 데이터를 아래의 단면 데이터로 설정된다

ID1 <- c(1,0,0) 
ID2 <- c(1,0,1) 
ID3 <- c(1,1,1) 
ID4 <- c(0,0,0) 
IDs <- c("1","2","3","4") 
df <- data.frame(rbind(ID1, ID2, ID3, ID4)) 
df <- cbind(IDs, df) 
colnames(df) <- c("ID", "Var1", "Var2", "Var3") 
I는 총 횟수를 포함하는 각각의 셀과, VAR1, 변수 2를 대입 할 때 변수 및 VAR3 대한 가중 인접 행렬을 만들려

두 변수는 관측치 사이에서 함께 발생한다.

그래서 내가 생각한 기본 절차는 각 셀에 대해 1 또는 0으로 각 행 (각 ID 번호)에 대해 별도의 행렬을 만들어 두 변수가 ID에 대해 존재하는지 여부를 나타냅니다. 그리고 나서이 행렬들을 합쳐서, 최종 행렬은 총 출현 수를 얻습니다.

나는 주변을 둘러 보았고 제대로 얻지 못했습니다. 나는 outer를 사용하는 것을 생각했지만 순서대로 각 컬럼에 대해 작업해야했다. 이 답변은 꽤 가까웠지만 정확하게 어떻게 값을 합산했는지는 정확히 알 수 없었습니다. 결국 행렬 목록으로 끝났지 만 그 값은 초기 데이터와 일치하지 않습니다. Convert categorical data in data frame to weighted adjacency matrix. 그리고이 답변은 다른 유형의 데이터를 갖고있는 것처럼 보였지만 가까웠습니다. 그것은 나에게 ID를 기반으로 한 인접 매트릭스를 주었다. http://r.789695.n4.nabble.com/Conversion-to-Adjacency-Matrix-td794102.html

하나의 관측을 위해 수동으로 행렬을 생성하는 코드는 매우 복잡하여 그냥 내가 표현하고자하는 것에 대한 감각을 얻는다. 첫 번째 ID 관찰) 분명히

ID1 <- c(1,0,0) 

var1 <- ID1[[1]] 
var2 <- ID1[[2]] 
var3 <- ID1[[3]] 
onetwo <- var1 * var2 
onethree <- var1 * var3 
twothree <- var2 * var3 
oneone <- var1 * var1 
twotwo <- var2 * var2 
threethree <- var3 * var3 
rows1 <- rbind(oneone, onetwo, onethree) 
rows2 <- rbind(onetwo, twotwo, twothree) 
rows3 <- rbind(onethree, twothree, threethree) 
df2 <- cbind(rows1, rows2, rows3) 

이 적합하지 않습니다, 내 실제 데이터 세트는 198 명 관찰과 33 개 변수가 너무도 루프 또는 적용 기능의 사용으로 매우 비효율적이다.

내가 필요로하는 것보다 더 어렵게 만들고 있는지, 내 데이터가 무언가를하도록 강요하려는 경우 그럴 의도가 없다는 것을 알 수 없습니다. 그러나 누군가가 이전에 이런 종류의 과제에 부딪혔다면 알려 주시기 바랍니다. 원하는 인접성 매트릭스를 직접 생성하는 방법이 있습니까? 먼저 이것을 가장자리 목록으로 옮겨야합니까? 그렇게 할 수있는 좋은 방법이 있습니까? 첫 번째 단계 (데이터 프레임의 각 행에 대한 행렬 생성)를보다 효율적으로 수행 할 수있는 코드가 있습니까?

감사합니다.

답변

1

질문을 이해할 수 있을지 모르겠지만 원하는 것은 무엇입니까?

nc=33 
nr=198 
m3<-matrix(sample(0:1,nc*nr,replace=TRUE),nrow=nr) 
df3<-data.frame(m3) 
m3b <-matrix(0,nrow=nc,ncol=nc) 
for(i in seq(1,nc)) { 
    for (j in seq(1,nc)) { 
    t3<-table(df3[,i],df3[,j]) 
    m3b[i,j] = t3[2,2] # t3[2,2] contains the count of df3[,i] = df3[,j] = 1 
    # or 
    # t3 = sum(df3[,i]==df3[,j] & df3[,i] == 1) 
    # m3b[i,j] = t3 
    } 
} 

또는, 당신은 모든 것을 감사합니다, 1 또는 완벽하게 작동

m3c <-matrix(0,nrow=nc,ncol=nc) 
for(i in seq(1,nc)) { 
    for (j in seq(1,nc)) { 
    sv=0 
    for (k in seq(1,nr)) { 
     vi = df3[k,i] 
     vj = df3[k,j] 
     sv=sv+vi*vj  
    } 
    m3c[i,j] = sv 
    } 
} 
+0

0이면 동일한 결과를 제공하는 제품의 합을 원하는 경우. 첫 번째 옵션은 시뮬레이트 된 데이터를 사용하지는 않지만 내 데이터를 사용하여 t3 [2,2] 명령에 대한 "subscript out of bounds 오류"를 표시했습니다. 그러나 두 번째 버전 (m3c)이 효과가 있었고 제 데이터는 양이 많아서 훌륭했습니다. 도움을 주셔서 대단히 감사합니다. – PSR

+0

@ user3830805이 질문에 답하면 다른 사람이 응답하지 않도록 체크 표시를해야합니다. 대답이 유익했다면, 위쪽 화살표를 클릭하십시오. –

관련 문제