查找字符串向量的所有唯一组合的幂集

时间:2011-08-05 16:59:53

标签: r list unique combinations powerset

我试图找到一个向量/项目列表的所有唯一分组,长度为39.以下是我的代码:

x <- c("Dominion","progress","scarolina","tampa","tva","TminKTYS",
       "TmaxKTYS","TminKBNA","TmaxKBNA","TminKMEM","TmaxKMEM",
       "TminKCRW","TmaxKCRW","TminKROA","TmaxKROA","TminKCLT",
       "TmaxKCLT","TminKCHS","TmaxKCHS","TminKATL","TmaxKATL",
       "TminKCMH","TmaxKCMH","TminKJAX","TmaxKJAX","TminKLTH",
       "TmaxKLTH","TminKMCO","TmaxKMCO","TminKMIA","TmaxKMIA",
       "TminKPTA","TmaxKTPA","TminKPNS","TmaxKPNS","TminKLEX",
       "TmaxKLEX","TminKSDF","TmaxKSDF")

# Generate a list with the combinations  
zz <- sapply(seq_along(x), function(y) combn(x,y))
# Filter out all the duplicates
sapply(zz, function(z) t(unique(t(z)))) 

但是,代码会导致计算机内存不足。有一个更好的方法吗?我意识到我有一个很大的清单。感谢。

2 个答案:

答案 0 :(得分:3)

要计算所有唯一子集,您只需创建所有二进制向量,其长度与原始项目集的基数相同。如果有39个项目,那么您将查看长度为39的所有二进制向量。每个向量的每个元素标识,是或否,项目是否在相应的子集中。

由于有39个项目,并且每个项目可以在给定子集中或不在其中,因此存在2 ^ 39个可能的子集。排除空集,即全0矢量,你有2 ^ 39 - 1个可能的子集。

就像@joran所说的那样,大约有549B个向量。假设二进制向量最紧凑地表示数据(即没有字符串),那么您将需要549B * 39位来返回所有子集。我不认为你想存储这个:那是大约2.68E12字节。如果你坚持使用这些字符,你可能会有几十TB的数据。

购买一个可以支持这个系统的系统当然是可行的,但不是很划算。

在元级别,正如@JD所说,这很可能不是你真正需要去的路径。我建议发布一个新问题,也许可以在这里或在统计相关的SE网站上进行改进。

答案 1 :(得分:0)

您可以尝试使用expand.grid

  

从提供的矢量的所有组合创建数据框   因素。有关精确的详细信息,请参阅返回值的说明   这样做的方式。