我正在研究一个由~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”是指我在整个“随机化循环”中运行的实际次数。稍后,这将显然包括更多的步骤,而不仅仅是实际的采样。
此外,除了替换之外,我还有兴趣使用进行上述专长。
提前致谢,非常感谢您的帮助!
答案 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”。这绝对有效,但是对于很长的数据向量,我猜它可能变得很慢。
无论如何,谢谢你提供的答案和指示!非常感谢您的帮助: - )