从数据框中的数字创建集合

时间:2014-05-02 06:21:20

标签: r

我有这个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编程中使用它吗?谢谢你的帮助。

1 个答案:

答案 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