编写循环以创建较大数据帧的已排序子集

时间:2016-04-09 00:10:35

标签: r loops sorting

我想从更大的矩阵中提取一些已排序的行。这是一个例子:

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]]]
}

但正如你猜测的那样,事实并非如此。我已经尝试了几种变体,所以我没有一个特定的错误消息,这让我很不满。相反,我被困在概念问题上:如何从更大的矩阵中提取多个已排序的行?

1 个答案:

答案 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
##