R找到忽略NA的元组组
R find groups of tupples ignoring NAs
基于 ,我正在尝试基于多个列创建唯一性,如果“存在通过任何列组合的路径”,则行应分组到相同的 ID 中。不同之处在于我有不应该用于 link 行的 NA:
R 的目标是基于 id1
和 id2
创建 id3
,最小示例:
例如id1=1
与id2
的a
和b
相关。但是 id1=2
也与 a
相关,所以它们都属于一个组 (id3=group1
)。但由于 id1=2
和 id1=3
共享 id2=c
,因此 id1=3
也属于该组 (id3=1
)。元组 ((1,2),('a','b','c'))
的值没有出现在其他任何地方,因此没有其他行属于该组(一般标记为 group1
)。
library(igraph)
df = data.frame(id1 = c(1,1,2,2,3,3,4,4,5,5,6,6,NA,NA),
id2 = c('a',NA,'a','c','c','d','x',NA,'y','z','x','z',NA,NA),
id3 = c(rep('group1',6), rep('group2',6),NA,NA))
我的解决方案 因 NA
个值而失败。
g <- graph_from_data_frame(df, FALSE)
cg <- clusters(g)$membership
df$id4 <- cg[df$id1]
df
Obervation(行)2 和 8 是 linked,因为它们都有 NA
for id2
,但这应该被忽略。有没有办法t
您可以尝试使用下面的代码
components
+ memberships
+ merge
g <- graph_from_data_frame(na.omit(df))
merge(
df,
transform(
rev(stack(membership(components(g))[V(g)[names(V(g)) %in% df$id1]])),
values = paste0("group", values)
),
by.x = "id1",
by.y = "ind",
all = TRUE
)
或
decompose
+ merge
subg <- decompose(graph_from_data_frame(na.omit(df)))
merge(df,
do.call(
rbind,
Map(
function(x, y) cbind(setNames(unique(as_data_frame(x)[1]), "id1"), id3 = y),
subg,
paste0("group", seq_along(subg))
)
),
by = "id1",
all = TRUE
)
这给了你
id1 id2 id3
1 1 a group1
2 1 <NA> group1
3 2 a group1
4 2 c group1
5 3 c group1
6 3 d group1
7 4 x group2
8 4 <NA> group2
9 5 y group2
10 5 z group2
11 6 x group2
12 6 z group2
13 NA <NA> <NA>
14 NA <NA> <NA>
基于
R 的目标是基于 id1
和 id2
创建 id3
,最小示例:
例如id1=1
与id2
的a
和b
相关。但是 id1=2
也与 a
相关,所以它们都属于一个组 (id3=group1
)。但由于 id1=2
和 id1=3
共享 id2=c
,因此 id1=3
也属于该组 (id3=1
)。元组 ((1,2),('a','b','c'))
的值没有出现在其他任何地方,因此没有其他行属于该组(一般标记为 group1
)。
library(igraph)
df = data.frame(id1 = c(1,1,2,2,3,3,4,4,5,5,6,6,NA,NA),
id2 = c('a',NA,'a','c','c','d','x',NA,'y','z','x','z',NA,NA),
id3 = c(rep('group1',6), rep('group2',6),NA,NA))
我的解决方案 因 NA
个值而失败。
g <- graph_from_data_frame(df, FALSE)
cg <- clusters(g)$membership
df$id4 <- cg[df$id1]
df
Obervation(行)2 和 8 是 linked,因为它们都有 NA
for id2
,但这应该被忽略。有没有办法t
您可以尝试使用下面的代码
components
+memberships
+merge
g <- graph_from_data_frame(na.omit(df))
merge(
df,
transform(
rev(stack(membership(components(g))[V(g)[names(V(g)) %in% df$id1]])),
values = paste0("group", values)
),
by.x = "id1",
by.y = "ind",
all = TRUE
)
或
decompose
+merge
subg <- decompose(graph_from_data_frame(na.omit(df)))
merge(df,
do.call(
rbind,
Map(
function(x, y) cbind(setNames(unique(as_data_frame(x)[1]), "id1"), id3 = y),
subg,
paste0("group", seq_along(subg))
)
),
by = "id1",
all = TRUE
)
这给了你
id1 id2 id3
1 1 a group1
2 1 <NA> group1
3 2 a group1
4 2 c group1
5 3 c group1
6 3 d group1
7 4 x group2
8 4 <NA> group2
9 5 y group2
10 5 z group2
11 6 x group2
12 6 z group2
13 NA <NA> <NA>
14 NA <NA> <NA>