к практике))
У меня есть несколько млн вершин и большое кол-во связей между ними.
Хочется мне взять определенные вершины и построить от них всю цепочку связей, которые существуют.
Соответственно фрейм данных с вершинами я могу легко создать. Но как мне создать соответствующий фрейм данных для ребер? Вручную то отфильтровать ненужные связи я не могу, так не знаю их) Строю с помощью igraph. Подскажете, пжл, функцию, которая автоматом создаст фрейм с ребрами из фрейма вершин и признака, по которым эти ребра должны строиться?
или я чего то не понимаю и такой функции нет?))
Для направленного ациклического графа может попробовать igraph::subcomponent()
Спасибо. Наверное я еще рано взялся за практику. Пошел читать книгу, которую скидывали выше 😂
А что за признак-то? Без этого непонятна задача
ip адреса, например
Так как именно они должны строиться? Полагаю, вопрос же именно в том, как это закодить
да, как закодить. Есть уникальные id людей. Есть список их ip (от одного и больше). И нужен скрипт, в который кладешь нужный id, а он строит сеть по признаку ip.
То есть просто cooccurrence matrix?
Хотелось бы ответит да, но я не знаю что такое cooccurrence matrix)) Поэтому наверное я все же слишком рано пошел спрашивать, не доучив теорию)
Да не, в самый раз) вот, например: https://planspace.org/2013/01/30/visualize-co_occurrence/
Эхх, англиский он такой английский)) Но спасибо, ща посмотрю)
можно и на русском найти, наверное. Суть вот в чем: нужно создать матрицу, где по строкам айди, а по столбцам айпи переменожить матрицу на транспонированную по правилам линейной алгебры вот и получилась матрица смежности: каждая клетка матрица - сумма совместных пересечений Причем, можно как создать сеть с вершинами id, так и сеть с вершинами ip A <- matrix(c(1, 0, 0, 0, 0, 1, 1, 1, 0 , 1, 0 , 1), nrow = 3, dimnames = list(letters[1:3], c("one", "two", "three", "four"))) A t(A) %*% A A %*% t(A)
Кажется, понял, спасибо)
Кстати, уже как то спрашивал, но никто не подсказал. Нет какой то горячей клавиши для матричного умножения?) Гуглил, не нашел)
я, честно говоря, не могу себя представить ситуацию, когда этот оператор может понадобиться реально часто)
Когда учил матричное умножение - напрягало вводить в ручную))
Чего то застрял я на матрице смежности. Привел свой frame к виду - в первом столбце id людей, во втором их айпишники. То есть это длинный формат, id людей, у которых более одного ip повторяются. Думал просто привести таблицу к широкому формату через pivot_wider и получится исходная матрица для транспонирования и перемножения, однако эта функция делает таблицу с одной строкой, все id людей, приходящихся на один ip кладет как бы в вектор. Как заставить вытянуть их в строки?)
Хотя, я что то гоню, мне же надо привести к такому виду, чтобы в ячейках матрицы было кол-во пересечений
В общем, как создать то такую матрицу из данных в длинном формате? 😁
а зачем приводить? Некоторые пакеты для рисования графов вполне жрут длинные датасеты. Я, правда, пропустил начало дискуссии, но когда мне неск. месяцев назад надо было нарисовать граф, то это все оказалось достаточно тривиально с пакетом visNetwork https://datastorm-open.github.io/visNetwork/
Насколько я понимаю, например, пакету statnet нужна или матрица смежности или список рёбер. И нужно их как то создать из исходного дата сета
Посмотрю по ссылке, спс
Думайте о графе как о наборе векторов. У вектора должно быть начало и конец и его длинна, поэтому столбцов должно быть минимум три. Далее делаете pivot_wider, но этого мало т.к. матрица может получится несимметричной. Поэтому до pivot_wider делайте tidy::expand() чтобы все комбинации вершин присутствовали
Но зачем так сложно? Длинного датасета from - to вполне достаточно. Т.е. в минимальном варианте 2 переменные всего. Если появляются другие атрибуты (длина, толщина, цвет, форма) - это все новые переменные
Я просто ответил как сделать из длинного формата - матрицу. Вообще главное что нужно понять - это то, что должно быть таблица с рёбрами: “from” и “to” и отдельная таблица с узлами nodes
Ну да, похоже что проще просто сделать left join таблицы с вершинами и признаком связи с самой с собой, получив таким образом from и to, потом создать сеть через функцию network::network, а потом и извлечь матрицу смежности
Обсуждают сегодня