【发布时间】: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)
(自动)删除不必要的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 没有直接关系,这是分层模型的先决条件。