2016-09-03 2 views
1

다음 형식의 데이터가 있으며이 데이터에서 행렬을 만들고 싶습니다.행을 열로 변환하여 행렬을 만듭니다.

B<- c('nancy','bill','bob','badri','bill') 
c<- c('martial-arts','dance','sports','judo','judo') 

    df<- data.frame(B,C) 

row.names와 같은 그룹 및 사용자와 관련된 매트릭스를 만들고 싶습니다. 누구든지 어떤 제안을 할 수 있습니까?

user martial-arts dance sports judo 
    nancy  1   0  0 0 
    bill  0   1  0 1 
    bob  0   0  1 0 
    badri  0   0  0 1 
+1

'with (df, as.matrix (table (B, C)))'와 같은 모양입니다. –

+0

또는'reshape2 :: dcast (df, B ~ C, fun = 길이)'는 대용량 데이터에서는 더 좋지만 데이터 프레임은 반환합니다. –

+3

'xtabs (count ~., transform (df, count = 1))'도 마찬가지입니다. – thelatemail

답변

2

어쩌면 이런 일이 :

x <- c('nancy','bill','bob','badri','bill') 
y <- c('martial-arts','dance','sports','judo','judo') 

x0 <- unique(x); y0 <- unique(y) 
mat <- matrix(0L, length(x0), length(y0), dimnames = list(x0, y0)) 
mat[cbind(match(x, x0), match(y, y0))] <- 1L 

#  martial-arts dance sports judo 
#nancy   1  0  0 0 
#bill    0  1  0 1 
#bob    0  0  1 0 
#badri   0  0  0 1 

내가 사용한 행렬 인덱스는 :

  • match(x, x0)은 행 인덱스를 제공합니다;
  • match(y, y0)은 열 인덱스를 제공합니다.
  • cbind(match(x, x0), match(y, y0))은 1 인 경우 매트릭스 인덱스를 제공합니다.

    library(Matrix) 
    sparseMatrix(i = match(x, x0), j = match(y, y0), x = 1, dimnames = list(x0, y0)) 
    
    #4 x 4 sparse Matrix of class "dgCMatrix" 
    #  martial-arts dance sports judo 
    #nancy   1  .  . . 
    #bill    .  1  . 1 
    #bob    .  .  1 . 
    #badri   .  .  . 1 
    

    @thelatemail의 대안 :

    당신은 결과 행렬 것보다 더 많은 0을 가지고 아이디어가있는 경우

, 당신은 스파 스 매트릭스를 구성 할 수있다

## coding to factor with desired order of levels is necessary 
x <- factor(x, levels = x0) 
y <- factor(y, levels = y0) 

## dense matrix 
xtabs(~ x + y) 

#  y 
#x  martial-arts dance sports judo 
# nancy   1  0  0 0 
# bill    0  1  0 1 
# bob    0  0  1 0 
# badri   0  0  0 1 

## sparse matrix 
xtabs(~ x + y, sparse = TRUE) 

#4 x 4 sparse Matrix of class "dgCMatrix" 
#  martial-arts dance sports judo 
#nancy   1  .  . . 
#bill    .  1  . 1 
#bob    .  .  1 . 
#badri   .  .  . 1 
+0

네트워크 분석을위한 id 값을 가진 행렬을 만들 수 있습니까? 사용자의 경우 u1, u2, u3, 그룹의 경우 g1, g2, g3과 유사합니까? 정말 고마워! – user3570187

+0

그래, 내가 해냈어 :) – user3570187