通过查看两列中的成员重叠来确定团队编号

  • 本文关键字:重叠 成员 编号 团队 两列 r
  • 更新时间 :
  • 英文 :


这是我的玩具数据,其中 person1 和 person2 是我想从中计算same_team和which_team变量的输入。

df <- tibble::tribble(
  ~person1, ~person2, ~same_team, ~which_team,
  112,      576,        "n",           0,
  164,      987,        "n",           0,
  161,      191,        "y",           1,
  191,      161,        "y",           1,
  125,      146,        "y",           2,
  125,      200,        "y",           2,
  146,      125,        "y",           2,
  146,      200,        "y",           2,
  200,      125,        "y",           2,
  200,      146,        "y",           2)

由于人 191 在人 161 的行,反之亦然,他们在同一个团队中。同样,虽然人576在人112的行,但反之亦然,他们不在同一个团队。 因此,如果 person1 和 person2 在同一个团队中,我想在变量中说"y"same_team否则说"n"并在变量下分配一个唯一的团队编号which_team。如果我能在 SparkR 代码中获得解决方案,那就太好了。

我相信

这就是你所追求的:

library(dplyr)
library(igraph)
clust <- clusters(graph.data.frame(df %>% select(person1, person2)))$membership
teams <- data.frame(ids = as.numeric(names(clust)), which_team = clust)
df %>%
  left_join(teams, by = c("person1" = "ids")) %>%
  group_by(which_team) %>%
  mutate(same_team = ifelse(n() > 1, "y", "n")) %>%
  ungroup() %>%
  mutate(which_team = ifelse(same_team == "n", 0, which_team - sum(same_team == "n")))

它使用 igraph 包来标识不同群集(在你的案例中为团队(的数量,然后联接此信息。

由于您似乎想用 0 标记每个没有团队的人,所以最后一行用 ifelse 来做到这一点,同时还从其他集群中扣除此类人员的数量(因为igraph会自动将 2 之间的链接识别为 1 集群(。

数据:

df <- structure(list(person1 = c(112, 164, 161, 191, 125, 125, 146, 
146, 200, 200), person2 = c(576, 987, 191, 161, 146, 200, 125, 
200, 125, 146)), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"))

最新更新