2016-11-15 12 views
0

주파수 데이터 프레임으로부터 대칭 관계 매트릭스 : 두 값이 어디에R :이 같은 R의 주파수를 갖는 데이터 프레임이

V1 V2 V3 V4 
row1 1 2 0 1 
row2 0 6 0 3 
row3 3 0 0 0 
row4 0 0 2 0 
row5 4 1 0 0 
row6 3 0 1 1 
(more rows) 

a<-as.data.frame(matrix(c(1,2,0,1,0,6,0,3,3,0,0,0,0,0,2,0,4,1,0,0,3,0,1,1),byrow=T,ncol=4)) 

내가 각 행에 대해, 함수 계산할는> 열 사이 일치 0이므로 V1-V4에 대한 관계 행렬을 얻습니다.

V1 V2 V3 V4 
V1 
V2 2 
V3 1 0 
V4 2 2 1 

유용한 기능이 있습니까? 아니면 어떻게해야합니까?

답변

1

combn, sapplyrowSums을 사용하는 기본 R 방법입니다. 여기

# get the pairwise combination of variables 
varComb <- combn(names(df), 2) 
varComb 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] "V1" "V1" "V1" "V2" "V2" "V3" 
[2,] "V2" "V3" "V4" "V3" "V4" "V4" 

# get the counts 
counts <- sapply(seq_len(ncol(varComb)), 
       function(i) sum(rowSums(df[,varComb[,i]] > 0) == 2)) 

는 변수의 조합 값이 로우가 함께 sumed 것으로 간주되는 0 이상인지 여부에 기초하여 논리 행렬로 변환하는 데이터 프레임을 서브 세트하기 위해 사용된다 ( sum를 사용)를 계산할 수 있습니다. sapply을 사용하면 varComb에있는 모든 변수 쌍에이 계산을 적용 할 수 있습니다.

# put these into a data frame 
setNames(data.frame(t(varComb), counts), c("var1", "var2", "counts")) 
    var1 var2 counts 
1 V1 V2  2 
2 V1 V3  1 
3 V1 V4  2 
4 V2 V3  0 
5 V2 V4  2 
6 V3 V4  1 

, 우리는 우리가 데이터 프레임을 생성하고 한 줄의 변수에 이름을 적용 할 수있는 setNames을 사용할 수 있습니다 함께 이러한 결과를 퍼팅.


행렬에이 결과를 넣어, 당신은 cbind 및 매트릭스 부분 집합 사용할 수 있습니다

# construct empty matrix 
tempMat <- matrix(NA, 4, 4) 

# fill it in 
tempMat[cbind(as.integer(substr(dfNew$var2, 2, 2)), 
       as.integer(substr(dfNew$var1, 2, 2)))] <- dfNew$counts 

tempMat 
    [,1] [,2] [,3] [,4] 
[1,] NA NA NA NA 
[2,] 2 NA NA NA 
[3,] 1 0 NA NA 
[4,] 2 2 1 NA 

as.integersubstr은 행과 값을 배치 할 열을 추출을 cbind이 출력으로 변환 행렬 서브 세트에 사용되는 행렬 주변 하구의 조금 후 좋아

+0

깔끔한 생각이지만 출력을 매트릭스로 가져 오는 방법이 있습니까? – Zwentibold

0

내가 생각 해낸 무엇 : 꽤하지

a<-as.data.frame(matrix(c(1,2,0,1,0,6,0,3,3,0,0,0,0,0,2,0,4,1,0,0,3,0,1,1),byrow=T,ncol=4)) 
a[a>0]<-1 
a<-t(a)  
mat<-outer(1:nrow(a), 1:nrow(a), FUN=Vectorize(function(x,y) sum(a[x,]!=0 & a[y,]!=0))) 
mat[upper.tri(mat,diag=T)] <- 0 

,하지만 작동하는 것 같다.

+1

변형,'t (a> 0) % * % (a> 0) * lower.tri (행렬 (, ncol (a), ncol (a)))'도 효과가있는 것처럼 보입니다. 부등식에 대한 참/거짓은 곱셈에서 1/0으로 처리됩니다. – Frank