我想用 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)
(自动)删除不必要的 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/