我想从更大的矩阵中提取一些已排序的行。这是一个例子:
n.cols = 5
n.rows = 10
test.matrix <- matrix(runif(n.cols*n.rows), ncol = n.cols)
假设我想要第二列具有三个最高值的行矩阵。我可以使用data.table
包完成此操作,如下所示:
require(data.table)
test.dt = data.table(test.matrix)
var1.sort = test.dt[,.SD[order(V2,decreasing=TRUE)[1:3]]]
生成包含
的var1.sort
V1 V2 V3 V4 V5
1: 0.6551792 0.9226611 0.86754419 0.43032372 0.03408796
2: 0.9701061 0.9069784 0.64011847 0.07069091 0.27211697
3: 0.4633638 0.8198762 0.01301018 0.69369268 0.62023243
这正是我想要的。大。现在假设我想编写一个循环,以便我可以为许多不同的列执行类似的过程。我认为这应该通过
完成第一和第三列sort.list = list("V1", "V3")
for (n in sort.list) {
(n).list = test.dt[,.SD[order((n),decreasing=TRUE)[1:3]]]
}
但正如你猜测的那样,事实并非如此。我已经尝试了几种变体,所以我没有一个特定的错误消息,这让我很不满。相反,我被困在概念问题上:如何从更大的矩阵中提取多个已排序的行?
答案 0 :(得分:1)
这是一个想法:
lapply(c('V1','V3'),function(cn) test.dt[order(test.dt[,cn,with=F],decreasing=T)[1:3]]);
## [[1]]
## V1 V2 V3 V4 V5
## 1: 0.9949206 0.3704618 0.36016581 0.5348180 0.3464949
## 2: 0.9108933 0.0608218 0.03951099 0.1801457 0.8832705
## 3: 0.8157573 0.3232237 0.01518571 0.8879577 0.7788657
##
## [[2]]
## V1 V2 V3 V4 V5
## 1: 0.04260936 0.8815819 0.9903040 0.3934099 0.8170457
## 2: 0.63491716 0.1231150 0.8113234 0.3040940 0.5464126
## 3: 0.46112893 0.6895573 0.6498408 0.5549647 0.7815175
##
首先使用参数化列名cn
提取完整列,方法是将其传递给with=F
参数的j
变体:
test.dt[,cn,with=F]
实际上,如果您愿意,使用基本R语法的较短替代方法是:
test.dt[[cn]]
然后它调用order()
,生成所需的排序顺序,并使用[1:3]
索引前三个排序的索引。最后,它通过使用i
参数索引来从原始data.table对象中提取这些行。
如果你真的想要一个明确的for循环:
cns <- c('V1','V3');
res <- list();
for (cn in cns) res[[cn]] <- test.dt[order(test.dt[,cn,with=F],decreasing=T)[1:3]];
res;
## $V1
## V1 V2 V3 V4 V5
## 1: 0.9949206 0.3704618 0.36016581 0.5348180 0.3464949
## 2: 0.9108933 0.0608218 0.03951099 0.1801457 0.8832705
## 3: 0.8157573 0.3232237 0.01518571 0.8879577 0.7788657
##
## $V3
## V1 V2 V3 V4 V5
## 1: 0.04260936 0.8815819 0.9903040 0.3934099 0.8170457
## 2: 0.63491716 0.1231150 0.8113234 0.3040940 0.5464126
## 3: 0.46112893 0.6895573 0.6498408 0.5549647 0.7815175
##