这是我的玩具数据,其中 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"))