r - 如何根据嵌套在团队中的二元数据创建唯一 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
解决方案
这个问题实际上比一开始看起来更复杂:它不仅仅是一个简单的排名,而是在评估者网络中检测群体。对于这个小样本来说,一种过度杀伤但应该适合您的完整数据的方法是认识到这是一个带有子图的网络。我在网络分析方面不是超级熟练,但我知道足以弄清楚子图是什么,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
and 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 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
推荐阅读
- node.js - Express/node 将特定的 JSON 对象通过管道传输到 POST 请求中
- image - 避免每次页面加载时都获取图像 - vuejs
- java - 如何创建符号链接
- php - adding to PHP echo or styling
- c# - Update XAML TextBlock with value of public property from other class
- string - Value of type 'String' cannot be converted to System.Windows.Forms.Label
- javascript - How to make display change onclick()
- c - 我将如何通过检查周围的所有数字是否都小于它来找到局部最大值来遍历二维数组?
- prestashop - Prestashop for large business
- nginx - Nginx and enabling CORS