下采样R中的矩阵

时间:2016-11-18 21:13:50

标签: r matrix sampling downsampling

我有一个相对较高维度的矩阵Q(100X500000),我想对它进行下采样。通过下采样,我将用一个例子来解释。

设Q =

1 4 9
3 2 1

和下采样大小= n。我想从一个总和(Q)= 20个球中抽出n个球,每个球用6种方式中的1种颜色对应于矩阵的不同索引对。这就像我有一个颜色A的球,四个颜色的B球等,而且我正在画n个球而没有替换。

我希望它以相同的格式返回,作为矩阵。一个示例返回值,例如,下采样(Q,3)=

0 0 2
1 0 0

我的方法是尝试使用示例:

sample(length(as.vector(Q)), size=n, replace=FALSE, prob = as.vector(Q))

然而问题是,样本认为1:长度(as.vector(Q))就像我拥有的​​所有球一样,所以我不能画出超过长度(as.vector(Q))球,因为我我不会替换我的球。

那么为了适应我的方法,我需要通过从这个向量中减去1来更新我的概率,并使用某种类型的for循环逐个调用样本。它听起来不是很好的代码。

有没有更好的方法以R友好,不循环方式执行此操作?

2 个答案:

答案 0 :(得分:6)

效率有点低,但如果sum(Q) 太大,你可以通过分解/复制矢量然后采样,然后重新聚合/制表来实现这一点。

Q <- setNames(c(1,4,9,3,2,1),LETTERS[1:6])
n <- 10
set.seed(101)
s0 <- sample(rep(names(Q),Q),
       size=n,replace=FALSE)
Q2 <- table(factor(s0,levels=names(Q)))
## A B C D E F 
## 1 2 5 1 0 1 

我不确定你的矩阵结构。您可以使用dim(Q2) <- dim(Q)以与原始矩阵相同的顺序重新组织结果...

答案 1 :(得分:3)

这是一种非常好的方式。您可以使用专为Focus Next Element In Tab Index构建的函数替换<script type="text/javascript"> function focusNextElement() { var focussableElements = 'a:not([disabled]), button:not([disabled]), input[type=text]:not([disabled]), [tabindex]:not([disabled]):not([tabindex="-1"])'; if (document.activeElement && document.activeElement.form) { var focussable = Array.prototype.filter.call(document.activeElement.form.querySelectorAll(focussableElements), function(element) { return element.offsetWidth > 0 || element.offsetHeight > 0 || element === document.activeElement }); var index = focussable.indexOf(document.activeElement); focussable[index + 1].focus(); } } window.addEventListener('keydown', function(e) { if (e.keyIdentifier == 'U+000A' || e.keyIdentifier == 'Enter' || e.keyCode == 13) { if (e.target.nodeName === 'INPUT' && e.target.type !== 'textarea') { e.preventDefault(); focusNextElement(); return false; } } }, true); </script> 来提高效率(如有必要)。

which(x <= cq)[1]