2016-09-03 6 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

Похож на 'с (df, as.matrix (таблица (B, C)))' может это сделать. –

+0

Или 'reshape2 :: dcast (df, B ~ C, fun = length)', что, вероятно, лучше для больших данных, но возвращает кадр данных. –

+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 «s альтернатива:

## 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

Можно ли создать матрицу с идентификационными значениями для анализа сети? Как u1, u2, u3 для пользователей и g1, g2, g3 для групп? Спасибо! – user3570187

+0

Да, я сделал это :) – user3570187

Смежные вопросы