首页 > 解决方案 > 如何根据嵌套在团队中的二元数据创建唯一 ID,以便在列中创建唯一的团队标识?

问题描述

我的 TeamName 列不反映唯一的团队名称。因此,我必须找到一种方法来通过唯一的 RaterID 和 RateeID 列来识别唯一的团队。我的数据由团队内的二元信息组成。因此,如果 RateeID 列中出现了 RateerID 列中的数字,则表示两人在同一个团队中。我正在尝试创建一个唯一的团队 ID,但区分团队的唯一方法是当 RaterID 也出现在 RateeID 列中时。这是在团队中以循环方式收集的二元数据。我想我可以创建一个新列,将 RaterID 和 RateeID 结合起来,然后创建一个值(也许使用 rank 函数?),这将帮助我区分团队。我的数据包含超过 3000 个团队,所以我想我会先 group_by 团队名称,然后检查 dyads 的共性,以便创建一个新列,稍后我可以将其粘贴到 TeamName 中以创建一个唯一的团队 ID。这是我在这里的第一个问题,所以希望我能很好地表达这一点……</p>

我是 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 结合起来,最后得到一个唯一的团队 ID。

我想要的结果是:

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       

标签: rsyntaxdplyrgroupingunique

解决方案


这个问题实际上比一开始看起来更复杂:它不仅仅是一个简单的排名,而是在评估者网络中检测群体。对于这个小样本来说,一种过度杀伤但应该适合您的完整数据的方法是认识到这是一个带有子图的网络。我在网络分析方面不是超级熟练,但我知道足以弄清楚子图是什么,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::mapand tidygraph::as_tbl_graph,我将每个列表项转换为tbl_graphs数据框,然后将其按行绑定回单个数据框。这样做的原因是获取每个观察来自哪个列表项的 ID。

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

然后,我通过评估者 ID 将该组 ID 表连接回原始数据,并且对于每个团队名称,使用dense_rank. 这将获得团队 ID A1A2B1。如果需要,删除额外的列。

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

推荐阅读