Матрица смежности для пользователя в R

У меня есть данные следующим образом -

user_id     post_id
24376261    204506440
98461       204446324
98461       203026202
98461       203031838
311542      204351465
875740      203031838

Эти данные указывают на сообщения, к которым у пользователя есть комментарии в статье/сообщении веб-сайта. Теперь мне нужно создать матрицу с user_id в строках и столбцах, и значения будут равны 1, если эти пользователи подключены через сообщение в блоге, иначе 0. т.е. результат, который я хочу, будет выглядеть так:

user       24376261 98461   311542  875740
24376261    1       0       0       0
98461       0       1       0       1
311542      0       0       1       0
875740      0       1       0       1

Как я могу сделать это в R? Я попытался следовать методу Брайана из этого вопроса - матрица смежности в R, но я получаю объект R следующего класса -

> class(am)
[1] "dgCMatrix"
attr(,"package")

Как я могу преобразовать это в data.frame или что-то, что можно экспортировать в R?


person RHelp    schedule 16.04.2014    source источник


Ответы (1)


Вот подход, который дает вам желаемый результат:

tcrossprod(table(mydf))
#           user_id
# user_id    98461 311542 875740 24376261
#   98461        3      0      1        0
#   311542       0      1      0        0
#   875740       1      0      1        0
#   24376261     0      0      0        1
(tcrossprod(table(mydf)) != 0) + 0
#           user_id
# user_id    98461 311542 875740 24376261
#   98461        1      0      1        0
#   311542       0      1      0        0
#   875740       1      0      1        0
#   24376261     0      0      0        1

Если вы хотите, чтобы результат был data.frame, вы можете обернуть вывод в as.data.frame.matrix.


Это предполагает, что "mydf" определяется как:

mydf <- structure(list(user_id = c(24376261L, 98461L, 98461L, 98461L, 
311542L, 875740L), post_id = c(204506440L, 204446324L, 203026202L, 
203031838L, 204351465L, 203031838L)), .Names = c("user_id", "post_id"), 
class = "data.frame", row.names = c(NA, -6L))
person A5C1D2H2I1M1N2O1R2T1    schedule 16.04.2014
comment
Извините, это не дает мне того же результата, что и ваш. Можете ли вы сказать мне, что находится в таблице mydf? - person RHelp; 16.04.2014
comment
@RHelp, вы должны предоставить воспроизводимый пример, а не человек, который отвечает. Тем не менее, я добавил обновление с тем, что я использовал как mydf. - person A5C1D2H2I1M1N2O1R2T1; 18.04.2014
comment
Я добавил свои данные в свой вопрос. И спасибо за ваше терпение. Но это не работает с моим набором данных. Если я попробую ваше решение, я получу useri_id и post_id в своих строках, а также в своих столбцах, и все значения, заполняющие матрицу, равны 1 во всех комбинациях. - person RHelp; 18.04.2014
comment
@RHelp, вы вставили представление ваших данных, а не что-то, что говорит нам о структуре ваших данных. Используйте dput, чтобы делиться своими данными воспроизводимым образом. - person A5C1D2H2I1M1N2O1R2T1; 18.04.2014