R如何对行之间的部分重叠值进行分组?
R how to group part of overlapped values among rows?
我有一个数据框,其中一些行需要根据行之间的一些重叠值进一步分组
col1, col2
a1, 2;3
a2, 2
a3, 3;4
a4, 4
a5, 2;4
a6, 5
a7, 5;6
a8, 6;7
col2中的值2出现在第1,2行和第5行,因为值3是第2行1和第5行的值4和2定义为一组,那么值3和4都可以算作1组as 2;
组2也是一样,值5在第6行和第7行重叠,值6和值7是同一个case bonded,所以它们也可以归为一组。
因此,输出可以汇总到名为组的新列中,如下所示:
col1, col2, group
a1, 2;3, 1
a2, 2, 1
a3, 3;4, 1
a4, 4, 1
a5, 2;4, 1
a6, 5, 2
a7, 5;6, 2
a8, 6;7, 2
有什么想法可以使用 tidyverse/dplyr 吗?非常感谢!
这基本上是一个图形问题,您需要在其中找到相连的子图。这对于 igraph
库来说非常简单,唯一棘手的部分是正确地重塑数据。所以用样本数据
dd <- structure(list(col1 = c("a1", "a2", "a3", "a4", "a5"), col2 = c("2;3",
"2", "3;4", "4", "2;4")), class = "data.frame", row.names = c(NA,
-5L))
您可以使用
library(dplyr)
library(tidyr)
library(igraph)
dd %>%
separate_rows(col2) %>%
select(col1, col2) %>%
graph_from_data_frame(directed = FALSE) %>%
clusters() %>%
membership() %>%
tibble::enframe() %>%
right_join(dd, by=c("name"="col1"))
我们将数据扩展到不同的行,然后连接无向图中的所有边。我们 运行 进行简单的社区检测,并将这些结果强制返回到我们加入原始数据的数据框中。这确实假设 col1 中的值不与 col2 中存储的值重叠。
我有一个数据框,其中一些行需要根据行之间的一些重叠值进一步分组
col1, col2
a1, 2;3
a2, 2
a3, 3;4
a4, 4
a5, 2;4
a6, 5
a7, 5;6
a8, 6;7
col2中的值2出现在第1,2行和第5行,因为值3是第2行1和第5行的值4和2定义为一组,那么值3和4都可以算作1组as 2;
组2也是一样,值5在第6行和第7行重叠,值6和值7是同一个case bonded,所以它们也可以归为一组。
因此,输出可以汇总到名为组的新列中,如下所示:
col1, col2, group
a1, 2;3, 1
a2, 2, 1
a3, 3;4, 1
a4, 4, 1
a5, 2;4, 1
a6, 5, 2
a7, 5;6, 2
a8, 6;7, 2
有什么想法可以使用 tidyverse/dplyr 吗?非常感谢!
这基本上是一个图形问题,您需要在其中找到相连的子图。这对于 igraph
库来说非常简单,唯一棘手的部分是正确地重塑数据。所以用样本数据
dd <- structure(list(col1 = c("a1", "a2", "a3", "a4", "a5"), col2 = c("2;3",
"2", "3;4", "4", "2;4")), class = "data.frame", row.names = c(NA,
-5L))
您可以使用
library(dplyr)
library(tidyr)
library(igraph)
dd %>%
separate_rows(col2) %>%
select(col1, col2) %>%
graph_from_data_frame(directed = FALSE) %>%
clusters() %>%
membership() %>%
tibble::enframe() %>%
right_join(dd, by=c("name"="col1"))
我们将数据扩展到不同的行,然后连接无向图中的所有边。我们 运行 进行简单的社区检测,并将这些结果强制返回到我们加入原始数据的数据框中。这确实假设 col1 中的值不与 col2 中存储的值重叠。