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

R 通过查看两列中的成员重叠来确定团队编号,r,R,这是我的玩具数据,其中person1和person2是输入,我想从中计算相同的团队和团队变量 df <- tibble::tribble( ~person1, ~person2, ~same_team, ~which_team, 112, 576, "n", 0, 164, 987, "n", 0, 161, 191, "y", 1, 19

这是我的玩具数据,其中person1和person2是输入,我想从中计算相同的团队和团队变量

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)

df我相信这就是你想要的:

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")))

那么您输入的数据只是前两列?你如何从这些数据中分辨出谁在同一个团队中?这只是一个变量名,表明191人是否在161人的行中,反之亦然,他们是否在同一个团队中。很抱歉把名字弄混了,我还是不明白。112和576在同一行,他们不应该在同一个团队中吗?如果我们还有一行person1=576和person2=112,那么是的。当团队数量超过100或1000时,团队编号将如何分配?看看我的编辑,我想你会从这里的
igraph
中受益。我没有太多的时间,所以可以做得更优雅一些,但我相信这可以达到目的。我正在
df
上运行这个,只有
person1
person2
列。如果你删除了其他人,它应该会起作用。我还把我的数据包括在帖子里,并把代码缩短了一点。是的,我后来意识到了这一点。谢谢
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"))