【问题标题】:R how to group part of overlapped values among rows?R如何对行之间的部分重叠值进行分组?
【发布时间】:2021-10-31 12:44:23
【问题描述】:

我有一个数据框,其中一些行需要通过行之间的一些重叠值进一步分组

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 行,值 4将第5行的2定义为一组,则值3和4都可以算作1组为2;

对于第 2 组,值 5 在第 6 行和第 7 行重叠,值 6 和值 7 是相同的大小写键,因此它们也可以归为一组。

因此,可以将输出汇总到一个名为 group 的新列中,如下所示:

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 吗?非常感谢!

【问题讨论】:

  • 对不起,我不明白创建列组@Makunata的条件
  • 你能解释一下'按行之间的一些重叠值分组'吗?如果col2中有2,2,那么group应该是2?
  • 标准基于col2,第一行和第二行可以分组,因为它们都有重叠值“2”,然后它们也可以与a5行分组。由于第五行有“4”,那么第五行可以与a3和a4行分组。所以最后这5行可以算作1组。
  • 重叠值指的是col2,即2重叠3行,1、2、5行; 3 发生在第 1 行和第 3 行;第 3、4、5 行中的 4 个;有什么想法吗?
  • 您的意思是因为每一行都通过n 度与其他行通过col2 相似性连接,因此所有行都属于一个组?例如,如果a6col2 值为9,这将是group == 2 中的唯一行吗?这听起来像图或集合论方法是合适的。

标签: r dplyr tidyverse reshape


【解决方案1】:

这基本上是一个图问题,您需要找到连接的子图。这对于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 中存储的值重叠。

【讨论】:

  • 非常感谢 MrFlikc!你是我的英雄!对于遇到同样问题的其他新手,请注意,当您在使用 graph_from_data_frame() 函数时拥有较大的数据框时,您会将 col1 和 col2 作为前 2 列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
相关资源
最近更新 更多