【问题标题】:How to remove children of children in data frame to plot network in R?如何删除数据框中的孩子的孩子以在 R 中绘制网络?
【发布时间】:2020-03-26 02:17:22
【问题描述】:

我想用 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
}

【问题讨论】:

  • 我是否理解正确,您希望将所有项目保留在父项中而不是子项中?
  • 不,最后一部分只是一个想法,最终没有成功。我想从 df 中删除不直接相关的行。例如,保留第一行 (A B) 但删除第二行 (AC) 和第三行 (AD),因为 A 与 C 和 D 没有直接关系,而只是通过 B。
  • 因为 B(即 A 的孩子)也有 C 和 D 作为孩子。因此,A 与 C 和 D 没有直接关系,这是分层模型的先决条件。

标签: r igraph


【解决方案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 解决方案,那可能会更好。

【讨论】:

  • 如果就这么简单就好了!但是,我收到一条错误消息:“as.igraph.vs(graph, from) 中的错误:无效的顶点名称”:(
  • 抱歉,我遗漏了一个重要步骤。
  • 谢谢!!!这完美!我永远不会想到这一点。我尝试了我的一些数据,它一点也不慢。所以对我来说,这很好。
【解决方案2】:

这是dplyr 解决方案:

library(dplyr)

# get data
parent <- c("A","A","A","B","B","E")
child <-  c("B","C","D","C","D","D")
df <- data.frame(parent,child, stringsAsFactors = FALSE)

# remove rows that are not directly related
new_df <- anti_join(df,
          left_join(df,df,by=c("child"="parent")) %>% 
  select(parent,child=child.y) %>% 
  na.omit()) 

new_df
  parent child
1      A     B
2      B     C
3      B     D
4      E     D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多