R:将样本放入预定义大小的分区(分区样本向量)

时间:2012-07-02 01:01:52

标签: r vector sample data-partitioning

我正在研究一个由~10 ^ 6个值组成的数据集,这些数据集聚成可变数量的二进制数。在我的分析过程中,我试图随机化我的聚类,但保持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中。所以我想知道我是否刚刚错过了相应的名称功能,或者是否有人可以请我指出一个智能解决方案: - )

你的帮助&amp;时间非常感谢! : - )

最佳,

Lymond

更新

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

此外,除了替换之外,我还有兴趣使用进行上述专长。

提前致谢,非常感谢您的帮助!

2 个答案:

答案 0 :(得分: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.ndomndom”可能是此过程重复应用的次数,在这种情况下,您可能希望将replicate包裹在其中:

replic <- replicate(n=4, { x <- sample(unlist(data))
   list( x[1:4], x[5:8], x[9], x[10:12], x[13:15]) }  )

答案 1 :(得分:1)

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

原则上,我可以生成一个“数据”的单一排列的长向量,然后通过提供给split的 factor 参数将其拆分为长度为“sizes”的向量列表。为此,我需要为我的不同“数据”组添加一个额外的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”将结果分成长度为“大小”的矢量。

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

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