如何为等效的项目/零件创建组ID?

时间:2019-04-01 02:25:24

标签: r

数据集是2列数据集。 第1列是原始元素。第2列是原始元素的等效子元素。目的是创建将所有等效零件分组为同一组ID的组ID。

我已经考虑过编写循环语句来做到这一点,但是感觉它将对性能产生不利影响。运行此操作的原始数据集将有约400万行原始数据。

#Sample data
set.seed(78)
x = data.frame(Original = sample(letters, 10), Sub = sample(letters, 10))


#Sample output is 'Group_ID' column
y = data.frame(Original = x$Original, Sub = x$Sub, Group_ID = c("Group_01", "Group_02", "Group_02", "Group_03", "Group_04", "Group_02", "Group_05", "Group_04", "Group_06", "Group_05"))

输入是对象x。 第1行表示“ t”和“ w”是等效元素,并且属于一组。 ROw 2表示'u'和'o'是等效元素,并且属于一个组,依此类推...

输出是y中的“ Group_ID”列。

第1行:t和w包含在Group_01中(第一行,新组) 第2行:u和o在先前的任何组中都不会出现。创建了新的Group_02 第3行:“ o”已经是第2行的Group_02的一部分。因此,“ u”,“ o”,“ i”都是等效的,并且彼此可替代。因此,Group_02在这里被重用,依此类推...

使用此示例数据,可以看到Group_02行重复了3次(行#的2,3,6),Group_05行重复了2次(行#的7,10,其中的'f'是常见的元素)。

1 个答案:

答案 0 :(得分:2)

我第二个@Gregor的建议是确定由x引起的图的连接部分;这是一个基于您的数据的示例

library(igraph)
library(dplyr)
x %>%
    left_join(graph_from_data_frame(x) %>%
        components() %>%
        magrittr::extract2(1) %>%
        stack(),
        by = c("Original" = "ind")) %>%
    mutate(values = paste("Group", values, sep = ""))
#   Original Sub values
#1         t   w Group1
#2         u   o Group2
#3         o   i Group2
#4         r   p Group3
#5         s   g Group4
#6         i   z Group2
#7         f   e Group5
#8         g   l Group4
#9         b   a Group6
#10        v   f Group5

说明:从igraph构建一个x,确定所有连接的组件,然后将标识的组标签与原始数据合并。

请注意,您的预期输出似乎有误; 5 + 8行应具有相同的组标签。