数据集是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'是常见的元素)。
答案 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行应具有相同的组标签。