R语言 调整网络数据,使边双向延伸

7ajki6be  于 2023-02-20  发布在  其他
关注(0)|答案(2)|浏览(176)

我有一个数据框架,包含一个人的列表和他们的邻居。然而,数据表明乔希是他自己,艾玛和尼克的邻居,但艾玛不是乔希的邻居。

  1. x <- read.table(text = "
  2. Name ID Neighbour_ID
  3. Josh 1 1,2,3
  4. Emma 2 4
  5. Nick 3 1
  6. Mark 4 5
  7. Claire 5
  8. ", sep = " ", header = TRUE)
  9. x
  10. Name ID Neighbour_ID
  11. 1 Josh 1 1,2,3
  12. 2 Emma 2 4
  13. 3 Nick 3 1
  14. 4 Mark 4 5
  15. 5 Claire 5

这当然需要修正,我正在寻找一种方法来做到这一点。结果应该是这样的

  1. Name ID Neighbour_ID
  2. 1 Josh 1 2,3
  3. 2 Emma 2 1,4
  4. 3 Nick 3 1
  5. 4 Mark 4 2,5
  6. 5 Claire 5 4

补充:如果您发现一个更适合这个问题的标题,请随时编辑!

cbeh67ev

cbeh67ev1#

使用 igraph 包,将其转换为图形对象:

  1. library(dplyr)
  2. library(tidyr)
  3. library(igraph)
  4. g <- separate_rows(x, Neighbour_ID, convert = TRUE) %>%
  5. select(from = ID, to = Neighbour_ID) %>%
  6. filter(!is.na(to) & from != to) %>%
  7. graph_from_data_frame(directed = FALSE)
  8. g
  9. # IGRAPH 1eeedee UN-- 5 5 --
  10. # + attr: name (v/c)
  11. # + edges from 1eeedee (vertex names):
  12. # [1] 1--2 1--3 2--4 1--3 4--5
  13. plot(g)

我会在这里停止,因为我们的数据是 graph 格式的。但是如果你需要你的输出是 * data.frame *,那么就得到 edgelists 并合并回原始数据。

  1. gEdge <- get.edgelist(g)
  2. left_join(x %>% select(Name, ID),
  3. data.frame(unique(rbind(gEdge[, 1:2], gEdge[, 2:1]))) %>%
  4. mutate(X1 = as.integer(X1), X2 = as.integer(X2)) %>%
  5. summarise(Neighbour_ID = paste(sort(X2), collapse = ","), .by = X1),
  6. by = c("ID" = "X1"))
  7. # Name ID Neighbour_ID
  8. # 1 Josh 1 2,3
  9. # 2 Emma 2 1,4
  10. # 3 Nick 3 1
  11. # 4 Mark 4 2,5
  12. # 5 Claire 5 4
展开查看全部
nsc4cvqm

nsc4cvqm2#

  1. x %>%
  2. separate_rows(Neighbour_ID, convert = TRUE) %>%
  3. select(-Name) %>%
  4. rbind(setNames(rev(.), names(.))) %>%
  5. filter(ID != Neighbour_ID) %>%
  6. distinct()%>%
  7. left_join(select(x, -Neighbour_ID), c(ID = 'ID')) %>%
  8. summarise(Neighbour_ID = toString(sort(Neighbour_ID)), .by = c(Name, ID))
  9. # A tibble: 5 × 3
  10. Name ID Neighbour_ID
  11. <chr> <int> <chr>
  12. 1 Josh 1 2, 3
  13. 2 Emma 2 1, 4
  14. 3 Nick 3 1
  15. 4 Mark 4 2, 5
  16. 5 Claire 5 4

相关问题