Как создать уникальный идентификатор на основе двоичных данных, вложенных в команды, чтобы создать уникальный идентификатор команды в столбце? - PullRequest
0 голосов
/ 24 января 2019

Мой столбец TeamName не отражает уникальные имена команд.Поэтому мне нужно найти способ идентифицировать уникальные команды с помощью уникальных столбцов RaterID и RateeID.Мои данные состоят из двоичной информации в команде.Поэтому, если число в столбце RaterID появляется в столбце RateeID, оба участника входят в одну команду.Я пытаюсь создать уникальный идентификатор команды, но единственный способ различить команды - это когда RaterID также появляется в столбце RateeID.Это двоичные данные, собранные в виде круговой схемы в команде.Я подумал, что мог бы создать новый столбец, который объединяет RaterID и RateeID, а затем создать значение (возможно, используя функцию ранга?), Которое помогло бы мне различать команды.Мои данные содержат более 3000 команд, поэтому я подумал, что сначала я должен указать имя группы group_by, а затем проверить диады на общность, чтобы создать новый столбец, который я мог бы позже вставить в TeamName, чтобы получить уникальный идентификатор команды.Это мой первый вопрос здесь, так что, надеюсь, я сформулирую это хорошо ...

Я новичок в r и понятия не имею, что попробовать ...

#creating dataframe
df<-data.frame(RaterID = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 5, 5, 6, 6, 8, 8, 9, 9, 10, 10),
               RateeID = c(2, 3, 4, 1, 3, 4, 1, 2, 4, 6, 7, 5, 7, 9, 10, 8, 10, 8, 9), 
               TeamName = c('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B'))


#group by TeamName to ease calculating unique team ID for a big data
library(dplyr)
df %>%
  group_by(TeamName)

Здесь яЯ потерян… Как мне написать функцию, которая говорит, что если RaterID также встречается в RateeID ​​внутри группы (т. е. TeamName), то создаю уникальный идентификатор.Возможно использовать функцию ранга?Затем я мог бы использовать это для объединения с TeamName и, наконец, получить уникальный идентификатор команды.

Мой желаемый результат:

RaterID  RateeID TeamName UniqueTeamID   
 1          2       A          A1
 1          3       A          A1
 1          4       A          A1
 2          1       A          A1   
 2          3       A          A1
 2          4       A          A1   
 3          1       A          A1   
 3          2       A          A1   
 3          4       A          A1   
 5          6       A          A2   
 5          7       A          A2
 6          5       A          A2
 6          7       A          A2
 8          9       B          B1   
 8          10      B          B1   
 9          8       B          B1       
 9          10      B          B1   
 10         8       B          B1       
 10         9       B          B1       

1 Ответ

0 голосов
/ 19 апреля 2019

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

Создайте график данных и график, чтобы подтвердить, что это подграфы:

library(dplyr)
library(purrr)
library(igraph)
library(tidygraph)

rate_graph <- igraph::graph_from_data_frame(df)

plot(rate_graph)

igraph::decompose разбивает эти подграфы в список igraph объектов.Используя purrr::map и tidygraph::as_tbl_graph, я конвертирую каждый из этих элементов списка в tbl_graphs, а затем фреймы данных и связываю его по строкам обратно в один фрейм данных.Причина этого заключается в том, чтобы получить идентификатор, для которого поступает каждое наблюдение.

groups <- decompose(rate_graph) %>%
  map(as_tbl_graph) %>%
  map_dfr(as_tibble, .id = "group_num") %>%
  mutate(name = as.numeric(name))

Затем я присоединяю эту таблицу идентификаторов групп к исходным данным по идентификатору оценщика и для каждого имени команды:считая по идентификатору группы с dense_rank.Это получает идентификаторы команды A1, A2 и B1.Если нужно, отбросьте дополнительные столбцы.

df %>%
  left_join(groups, by = c("RaterID" = "name")) %>%
  group_by(TeamName) %>%
  mutate(subteam = dense_rank(group_num)) %>%
  mutate(team_id = paste0(TeamName, subteam)) %>%
  ungroup()
#> # A tibble: 19 x 6
#>    RaterID RateeID TeamName group_num subteam team_id
#>      <dbl>   <dbl> <fct>    <chr>       <int> <chr>  
#>  1       1       2 A        1               1 A1     
#>  2       1       3 A        1               1 A1     
#>  3       1       4 A        1               1 A1     
#>  4       2       1 A        1               1 A1     
#>  5       2       3 A        1               1 A1     
#>  6       2       4 A        1               1 A1     
#>  7       3       1 A        1               1 A1     
#>  8       3       2 A        1               1 A1     
#>  9       3       4 A        1               1 A1     
#> 10       5       6 A        2               2 A2     
#> 11       5       7 A        2               2 A2     
#> 12       6       5 A        2               2 A2     
#> 13       6       7 A        2               2 A2     
#> 14       8       9 B        3               1 B1     
#> 15       8      10 B        3               1 B1     
#> 16       9       8 B        3               1 B1     
#> 17       9      10 B        3               1 B1     
#> 18      10       8 B        3               1 B1     
#> 19      10       9 B        3               1 B1
...