Создание матрицы перехода из данных кликов википедии - PullRequest
1 голос
/ 05 апреля 2019

Я пытаюсь создать матрицу перехода из набора данных Wikipedia Clickstream.При этом я хотел бы показать вероятность того, что пользователи переходят из одной статьи в Википедии в другую.

У меня есть кадр данных, состоящий из трех столбцов.Source.category ссылается на заголовок исходной статьи, а target.category ссылается на заголовок целевой статьи.Третий столбец «Всего» и относится к количеству кликов (то есть, сколько раз пользователи переходили из этой исходной статьи в целевую статью).

Исходя из этого, я хотел бы рассчитать вероятности перехода от исходной статьи к целевой статье с учетом количества кликов.

Вот сводка моего фрейма данных:

source.category    target.category        total      
 Length:98          Length:98          Min.   :   21  
 Class :character   Class :character   1st Qu.:  684  
 Mode  :character   Mode  :character   Median : 2132  
                                       Mean   : 5395  
                                       3rd Qu.: 5296  
                                       Max.   :53378 

Будет ли лучший способ создать функцию?

trans.matrix <- function (...) </p>

Как бы выглядела эта функция?

А затем поместите ее в: trans.matrix (as.matrix (дф))?

1 Ответ

1 голос
/ 05 апреля 2019

Я бы сделал это, используя пакет reshape2. Я создал минимальный набор данных, чтобы проиллюстрировать это:

set.seed(42)

dataset <- expand.grid(letters[1:4], LETTERS[1:4])
dataset$total <- rpois(16, 1)

names(dataset) <- c("source.category", "target.category", "total")
# set the last row to the first row to illustrate fill and aggregate
dataset[16, ] <- dataset[1, ] 

Затем просто используйте функцию acast, чтобы создать матрицу, и, наконец, нормализуйте суммы строк до 1.

require(reshape2)

# reshape to wide format
res <- acast(
  dataset, # the dataset
  source.category ~ target.category, # the margins of the result
  value.var = "total", # which variable should be in the cells
  fill=0L, # fill empty cells with this value
  fun.aggregate = sum # aggregate double cells with this function
  )

# normalize rowSums to 1
res <- res / rowSums(res)

# this is your result
res

Редактировать: на больших наборах данных это будет длиться вечно или даже потерпеть неудачу. Для больших наборов данных используйте разреженные матрицы из пакета Matrix, это намного быстрее и дает результат, который намного меньше в хранилище.

require(Matrix)

dataset$target.category <- factor(dataset$target.category)
dataset$source.category <- factor(dataset$source.category)

res <- sparseMatrix(
  as.integer(dataset$target.category),
  as.integer(dataset$source.category),
  x = dataset$total
)

res <- res/rowSums(res)

Это достаточно быстро для всего набора данных, чтобы работать в интерактивном режиме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...