1

我正在研究一个由 ~10^6 个值组成的数据集,这些值聚集到可变数量的 bin 中。在我的分析过程中,我试图随机化我的聚类,但保持 bin 大小不变。作为一个玩具示例(在伪代码中),这看起来像这样:

data <- list(c(1,5,6,3), c(2,4,7,8), c(9), c(10,11,15), c(12,13,14));
sizes <- lapply(data, length);
for (rand in 1:no.of.randomizations) {
    rand.data <- partition.sample(seq(1,15), partitions=sizes, replace=F)
}

所以,我正在寻找一个像“partition.sample”这样的函数,它将采用一个向量(如 seq(1,15))并从中随机采样,返回一个列表,其中的数据已分区为由“给出的正确 bin 大小”尺寸”。

我一直在尝试自己编写一个这样的函数,因为这项任务似乎并不难。但是,将向量划分为给定的 bin 大小看起来如果“在后台”完成会更快、更有效,这意味着可能不在本机 R 中。所以我想知道我是否只是错过了适当的名称功能,或者是否有人可以指点我周围的智能解决方案:-)

非常感谢您的帮助和时间!:-)

最好的,

莱蒙德

更新

“no.of.randomizations”是指我运行整个“随机化循环”的实际次数。稍后,这显然会包括比实际采样更多的步骤。

此外,我还对在不替换的情况下进行上述采样的技巧感兴趣。

在此先感谢,非常感谢您的帮助!

4

2 回答 2

5

修订:这应该是相当有效的。它的复杂性应该主要在排列步骤中:

# A single step:
x <- sample( unlist(data)) 
list( one=x[1:4], two=x[5:8], three=x[9], four=x[10:12], five=x[13:16]) 

如上所述,“no.of.randomizations”可能是此过程的重复应用次数,在这种情况下,您可能需要replicate环绕它:

replic <- replicate(n=4, { x <- sample(unlist(data))
   list( x[1:4], x[5:8], x[9], x[10:12], x[13:15]) }  )
于 2012-07-02T01:54:24.667 回答
1

经过一番思考和谷歌搜索,我想出了一个可行的解决方案。但是,我仍然不相信这是最快和最有效的方法。

原则上,我可以生成一个“数据”的唯一排列的长向量,然后通过提供给拆分的因子参数将其拆分为长度为“大小”的向量列表。为此,我需要为我的不同“数据”组提供一个额外的 ID 方案,我碰巧有这个方案。

当被视为代码时,它变得更加清晰:

data <- list(c(1,5,6,3), c(2,4,7,8), c(9), c(10,11,15), c(12,13,14));
sizes <- lapply(data, length);

至此,一切如上

names <- c("set1", "set2", "set3", "set4", "set5");

就我而言,我很幸运已经从数据中提供了“名称”。否则,我将不得不将它们作为(例如)

names <- seq(1, length(data));

然后可以使用 rep 将这个“名称”向量扩展为“大小”:

cut.by <- rep(names, times = sizes);
[1] 1 1 1 1 2 2 2 2 3 4 4 4 5
[14] 5 5

然后可以将这个新向量“cut.by”作为参数提供给 split()

rand.data <- split(sample(1:15, 15), cut.by)
$`1`
[1]  8  9 14  4
$`2`
[1] 10  2 15 13
$`3`
[1] 12
$`4`
[1] 11  3  5
$`5`
[1] 7 6 1

这可以完成我一直在寻找的工作。它从背景“1:15”中采样,并通过向量“cut.by”将结果拆分为长度为“sizes”的向量。

但是,我仍然不乐意通过额外的(可能)长向量来指示拆分位置,例如上面代码中的“cut.by”。这绝对有效,但对于非常长的数据向量,我猜它可能会变得非常慢。

无论如何,感谢您提供的答案和指示!非常感激您的帮忙 :-)

于 2012-07-03T10:55:27.950 回答