【问题标题】:How do I create a unique ID based on dyadic data nested within teams in order to create a unique team identification in a column?如何根据嵌套在团队中的二元数据创建唯一 ID,以便在列中创建唯一的团队标识?
【发布时间】:2019-06-18 15:34:22
【问题描述】:

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

我是 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       

【问题讨论】:

    标签: r syntax dplyr grouping unique


    【解决方案1】:

    这个问题实际上比一开始看起来更复杂:它不仅仅是一个简单的排名,而是在一个评分者-评分者网络中检测群体。对于这个小样本来说,一种过度杀伤但应该适合您的完整数据的方法是认识到这是一个带有子图的网络。我在网络分析方面不是超级熟练,但我知道足以弄清楚子图是什么,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::maptidygraph::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 计数。这将获得团队 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多