r - 如何删除数据框中的子项以在 R 中绘制网络?

标签 r igraph

我想用 R 绘制一个网络。但是,问题是我的数据框包含关系数据,还包含子项的子项。它看起来像下面这样:

parent <- c("A","A","A","B","B","E")
child <-  c("B","C","D","C","D","D")
df <- data.frame(parent,child)

我想删除 df 中子项的子项,以便我可以使用 igraph 绘制我的网络。所以基本上,我希望我的数据看起来像 df_net:

parent <- c("A","B","B","E")
child <-  c("B","C","D","D")
df_net <- data.frame(parent,child)
net <- graph_from_data_frame(df_net,directed = T)
plot(net)

Figure of plot(net)

(自动)删除不必要的 df 行的最佳方法是什么? (我有几个最多 100 行的数据框 - 因此不能手动删除行。)

我的第一个想法是使用 while 循环在每个分层步骤中查找父级。我想我可以用它来过滤 df 中的行。但我不认为我走在正确的轨道上。任何想法表示赞赏!

`%notin%` <- Negate(`%in%`)
i <- nrow(df)
y <- list()
z <- list()
j <- 1
while (i > 0) {
  v <- unique(df$parent[!(df$parent %in% df$child)]) # find mismatch (only in parent, not in child)
  df <- df %>% filter(parent %notin% v)
  print(v)
  y[[j]] <- v
  z[[j]] <- df
  i = nrow(df)
  j = j+1
}

最佳答案

如何使用 igraph 确定个体之间的路径,如果超过 1 个,则删除该连接?

library(igraph)
parent <- c("A","A","A","B","B","E")
child <-  c("B","C","D","C","D","D")
df <- data.frame(parent,child)
net <- graph_from_data_frame(df,directed = T)
df <- df[apply(df,1,function(x){length(all_simple_paths(net,x[1],x[2]))}) == 1,]
df
  parent child
1      A     B
4      B     C
5      B     D
6      E     D

我担心这在非常大的图表上可能会很慢,所以如果有人有 data.table 解决方案,那可能会更好。

关于r - 如何删除数据框中的子项以在 R 中绘制网络?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60851355/

相关文章:

r - 计算 R 中的 Eta 平方以进行重复测量

r - 如何在 igraph 中对社区集群内的边缘进行着色

r - 如何在R中绘制二部图

networking - R 中的巨型组件

r - 在 R 中对每组进行变异

RPostgreSQL 安装错误 - RPostgreSQL.so : undefined symbol: PQpass

r - 当分配给数据框时,因子变成字符

用密文替换字母

r - 箭头隐藏在顶点后面

c - 如何计算 mst 图的成本。