【发布时间】:2016-05-08 14:24:18
【问题描述】:
我有一个向量列表,每个向量都包含许多元素。我想确定具有最大覆盖唯一元素的向量的最小数量。例如,如果向量表示为二进制数据框中的行,列中的唯一元素,如下所示:
>df<- data.frame(a=c(1,0,0,0,0),b=c(1,1,1,1,0),c=c(1,0,1,1,1),d=c(0,0,0,1,1),e=c(0,0,0,1,1), f=c(0,0,0,0,1))
> df
a b c d e f
1 1 1 1 0 0 0
2 0 1 0 0 0 0
3 0 1 1 0 0 0
4 0 1 1 1 1 0
5 0 0 1 1 1 1
假设向量是从 1 到 5 的行,并且它们包含元素 a 到 f 的不同组合。我想获得覆盖尽可能多的元素的最小代表向量或行。在这个例子中,最小代表(最大简约)向量是第 1 行和第 5 行。有没有办法在统计上做到这一点?我试图在双向聚类热图中可视化数据集,以手动识别最小组合。但是,有没有一种统计方法可以处理这个问题并能够提供一些选择性能的数字度量?
另一个例子来说明我的问题。给定以下向量:
> vec.1 <- c("a", "c", "d")
> vec.2 <- c("a", "b", "c", "d")
> vec.3 <- c("b","e")
> vec.4 <- c("b", "c", "d", "g")
> vec.5 <- c("f","g")
最小组合是 2,3 和 5,因为它们覆盖了从 a 到 g 的所有元素,并且重叠最少。在较大的数据集中,可能有多个答案,但是,组合中的向量数量越少越好。 谢谢。
【问题讨论】:
-
你需要
i1 <- apply(df, 1, FUN = function(x) length(rle(x)$values));df[i1,] -
这是一个组合问题。第一:是否有一行全为 1?如果不是第二个:是否存在涵盖所有元素的两行组合。如果不是: ... 三 ... 使用函数
combn()生成组合。如果找到组合,则计算重叠量以选择重叠最小的组合。
标签: r