Расширение всех уникальных комбинаций автора-автора по группам в тидыре - PullRequest
0 голосов
/ 19 мая 2018

У меня есть датафрейм с информацией с доски объявлений.Данные выглядят так:

    require(dplyr)
    require(tidyr)
    df <- data.frame(author = c(2,4,8,16,32,64,128,256,512,1024),
             topic = c(101,101,101,101,301,301,501,501,501,501),
             time = c("2014-08-16 20:20:11", "2014-08-16 21:10:00", "2014-08-17 06:30:10",
                        "2014-08-17 10:08:32", "2014-08-20 22:23:01","2014-08-20 23:03:03",
                        "2014-08-25 17:05:01", "2014-08-25 19:15:10",  "2014-08-25 20:07:11",
                        "2014-08-25 23:59:59"))

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

test <- df %>% group_by(topic) %>% expand(nesting(author), author)
print(test, n = 20)

# A tibble: 36 x 3
# Groups:   topic [3]
topic author author1
    <dbl>  <dbl>   <dbl>
 1  101.     2.      2.
 2  101.     2.      4.
 3  101.     2.      8.
 4  101.     2.     16.
 5  101.     4.      2.
 6  101.     4.      4.
 7  101.     4.      8.
 8  101.     4.     16.
 9  101.     8.      2.
10  101.     8.      4.
11  101.     8.      8.
12  101.     8.     16.
13  101.    16.      2.
14  101.    16.      4.
15  101.    16.      8.
16  101.    16.     16.
17  301.    32.     32.
18  301.    32.     64.
19  301.    64.     32.
20  301.    64.     64.

Мне нужна помощь для двух вещей:

  1. Как удалить поменяемые местами комбинации (например, строки 2 и 5)?
  2. Для каждой комбинации я хотел бы иметь атрибуты:
    • start = самое раннее сообщение по теме (используйте mutate, min = min (время))
    • duration изtopic (время для последнего сообщения по теме минус время для первого сообщения по теме, использовать длительность мутирования = max (время) - min (время))
    • количество posts (использовать суммирование)?

Ответы [ 4 ]

0 голосов
/ 22 мая 2018

Я обнаружил пакет iterpc.Это быстро и делает комбинации.Вот мой пример кода:

df <- data.frame(author_id = c(2,4,8,16,32,16,128,256,512,8),
             topic_id = c(101,101,101,101,301,301,501,501,501,501),
             time = as.POSIXct(c("2014-08-16 20:20:11", "2014-08-16 21:10:00", "2014-08-17 06:30:10",
                                 "2014-08-17 10:08:32", "2014-08-20 22:23:01","2014-08-20 23:03:03",
                                 "2014-08-25 17:05:01", "2014-08-25 19:15:10",  "2014-08-25 20:07:11",
                                 "2014-08-25 23:59:59")))

Сначала я создаю уникальный список узлов (вершин графа) * ​​1004 *

node <- df %>% distinct(author_id, vendor) %>% rename(id = author_id) 

Затем я создаю свой список ребер, используя iterpc следующим образом:

library(iterpc)
edge <- df %>% group_by(topic_id) %>% do(data.frame(getall(iterpc(table(.$author_id), 2, replace =TRUE)))) %>%
 filter(X1 != X2) %>% rename(from = X1, to = X2) %>% select(to, from, topic_id)

Это сделано, я строю свой график:

library(igraph)
test_net <- graph_from_data_frame(d = edge, directed = F, vertices = node)
plot(test_net)
0 голосов
/ 19 мая 2018

Вы не обязательно хотите использовать tidyr::expand() (кажется, левое соединение), чтобы попытаться сгенерировать комбинаций , вы, кажется, получаете все перестановок вместо этого: В частности, поменялись местами нежелательные комбинации «я-я» и комбинации с author1, author2 (т.е. перестановки).Точно так же встроенный base::expand.grid() делает перестановки не комбинациями.

Используйте встроенный combn() (это в utils::combn()).

Есть много существующих вопросов по dplyr groupby combn, вы можете найти их с помощью простого поиска.

Я пытался опубликовать рабочий код, но я не очень хорошо знаю tidyr, все, что я пробовал, не работало или синтаксическая ошибка.expand хочет фрейм данных, тогда он ссылается на переменные.Так что %>% expand(author, author) снова дает вам все перестановки, а не только комбинации.%>% complete(...) кажется бесполезным.Я думаю, что вам нужен синтаксис tidyr для вызова combn на author на этом уровне группировки.Это может быть вложенный подзвук для каждого уровня группировки, с любым эквивалентом тидира do.call.

0 голосов
/ 19 мая 2018

Окончательное решение:

time <- df %>% group_by(topic) %>% mutate(posts = n(), start = min(time), duration = (max(time) - min(time))/3600) %>% distinct(topic,start,duration)
combo <- df %>% group_by(topic) %>% do(data.frame(t(combn(.$author,2))))
edges <- right_join(combo, time)
edges

# A tibble: 13 x 5
# Groups:   topic [?]
   topic    X1    X2 start               duration         
   <dbl> <dbl> <dbl> <dttm>              <time>           
 1  101.    2.    4. 2014-08-16 20:20:11 13.8058333333333 
 2  101.    2.    8. 2014-08-16 20:20:11 13.8058333333333 
 3  101.    2.   16. 2014-08-16 20:20:11 13.8058333333333 
 4  101.    4.    8. 2014-08-16 20:20:11 13.8058333333333 
 5  101.    4.   16. 2014-08-16 20:20:11 13.8058333333333 
 6  101.    8.   16. 2014-08-16 20:20:11 13.8058333333333 
 7  301.   32.   64. 2014-08-20 22:23:01 0.667222222222222
 8  501.  128.  256. 2014-08-25 17:05:01 6.91611111111111 
 9  501.  128.  512. 2014-08-25 17:05:01 6.91611111111111 
10  501.  128. 1024. 2014-08-25 17:05:01 6.91611111111111 
11  501.  256.  512. 2014-08-25 17:05:01 6.91611111111111 
12  501.  256. 1024. 2014-08-25 17:05:01 6.91611111111111 
13  501.  512. 1024. 2014-08-25 17:05:01 6.91611111111111
0 голосов
/ 19 мая 2018

Я частично решил свою проблему следующим образом:

test <- df %>% group_by(topic) %>%
            mutate(posts=n(), start=min(time), duration=(max(time)-min(time))/3600) %>%
            expand(nesting(author), author, posts, start, duration) %>% filter(author != author1)
test
# A tibble: 36 x 6
# Groups:   topic [3]
   topic author author1 posts start               duration
   <dbl>  <dbl>   <dbl> <int> <dttm>                 <dbl>
 2  101.     2.      4.     4 2014-08-16 20:20:11     13.8
 3  101.     2.      8.     4 2014-08-16 20:20:11     13.8
 4  101.     2.     16.     4 2014-08-16 20:20:11     13.8
 5  101.     4.      2.     4 2014-08-16 20:20:11     13.8
 7  101.     4.      8.     4 2014-08-16 20:20:11     13.8
 8  101.     4.     16.     4 2014-08-16 20:20:11     13.8
 9  101.     8.      2.     4 2014-08-16 20:20:11     13.8
10  101.     8.      4.     4 2014-08-16 20:20:11     13.8
# ... with 26 more rows

Еще нужно выяснить, какие комбинации поменялись местами!

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