我有这个data.frame:
structure(list(X0 = c(9, 13, 13, 13, 35, 36, 37, 38, 39, 40,
40, 42, 43, 44), X0.1 = c(10, 40, 45, 46, 36, 37, 38, 40, 46,
45, 46, 43, 44, 46)), .Names = c("A", "B"), row.names = c(NA,
14L), class = "data.frame")
A B
1 9 10
2 13 40
3 13 45
4 13 46
5 35 36
6 36 37
7 37 38
8 38 40
9 39 46
10 40 45
11 40 46
12 42 43
13 43 44
14 44 46
我想创建这样的集合:第2,3行和第4行有13个,所以它们将被分组成一组(13,40,45,46)。
如果任何进一步的行甚至有一个与该集合相同的成员,则该行的两个成员都将包含在该集合中。
由于第8行与上面的集合共有40个,所以该集合也将包括它们:(13,40,45,46,38)
现在第7行现在有一个与此集合相同的成员(38),其他成员(37)也将包含在此集合中。该集将成为(13,40,45,46,38,37)
如果一行中的2个成员都不是任何现有集合的共同成员,则它们将形成自己的集合。就像第1行有9和10一样,其中任何一行都没有。所以他们组成一组(9,10)
最后我要打印出所有套装。
我可以在R编程中使用它吗?谢谢你的帮助。
答案 0 :(得分:0)
这是你想要的吗?
f <- function(s, v) {
m <- which(s$A %in% v | s$B %in% v)
if (!any(m)) v
else Recall(s[-m, ], sort(unique(c(v, c(unlist(s[m, ]))))))
}
done <- c()
for(n in unique(unlist(d))) {
if (n %in% done) next
r <- f(d, n)
done <- c(done, r)
cat("(", r, ") ")
}
输出
( 9 10 ) ( 13 35 36 37 38 39 40 42 43 44 45 46 )
<强>更新强>
done <- c()
ret <- list()
for(n in unique(unlist(d))) {
if (n %in% done) next
r <- f(d, n)
done <- c(done, r)
cat("(", r, ") ")
ret <- c(ret, list(r))
}
然后,
> ret
[[1]]
[1] 9 10
[[2]]
[1] 13 35 36 37 38 39 40 42 43 44 45 46