R 通过查看两列中的成员重叠来确定团队编号
这是我的玩具数据,其中person1和person2是输入,我想从中计算相同的团队和团队变量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
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"))