我有一个矩阵,我只想从中提取第一列中的数字大于/小于特定数量的前20000行。我尝试了以下但它不起作用并将完全错误的矩阵存储到 temp 变量中:
temp <- var[var[1:20000, 3]<60, ]
但是,以下方法有效,但会提取满足确定条件的所有行:
temp <- var[var[, 3]<60, ]
如何解决此问题?
提前致谢
答案 0 :(得分:4)
试试这个:
temp <- var[var[, 3]<60, ][1:2000,] # Only keep the first 20000 rows of the result
答案 1 :(得分:2)
答案1肯定有效。我很好奇另一种方法可能如何起作用。这个使用R包data.table。这可能是一个很好的选择,因为你要求20,000行的子集。 data.table非常适合在大型数据集(数百万行)上进行子设置和预先计算。如果您确实需要20000 x n矩阵进行矩阵运算,这可能是将一个非常大的结构子设置为较小的部分然后转换回矩阵类型结构的良好开端。无论如何,对于冗长的介绍感到抱歉。
设定:
matrixGenerator <- matrix(rnorm(4000,25,2.5),ncol=4) # sample matrix
library(data.table)
var <- data.table(matrixGenerator) # covert matrix to data.table
str(var) # what does var look like
Classes ‘data.table’ and 'data.frame': 1000 obs. of 4 variables:
$ V1: num 24.5 23.3 23 30.4 21.3 ...
$ V2: num 27.8 29.8 23.2 23.2 20.1 ...
$ V3: num 24.8 23.2 25.3 23.2 27.9 ...
$ V4: num 29.4 26.8 23.5 29.9 23.6 ...
# data.table names the columns so you'll have to use those in the syntax below
从sql角度看data.table结构:
[i,j,k] = [where,select,group by]
所以对原来的问题:
var[V1<20,head(.SD,10),] # give rows where V1 < 20 and head() returns 10
V1 V2 V3 V4
1: 15.31989 19.65829 23.63891 26.03069
2: 17.45041 29.99338 25.90798 23.26868
3: 18.07311 27.82854 27.09712 24.78181
4: 19.13734 28.47680 22.40267 28.63907
5: 17.75329 22.03210 28.89607 25.69952
6: 19.66230 24.42867 21.84213 21.53471
7: 19.05977 28.76396 29.83406 28.11025
8: 19.29034 29.50401 24.77912 24.30352
9: 18.92708 24.79214 20.27407 27.51422
10: 17.77079 20.48539 27.72196 28.94075
在一天结束时,如果您确实需要一个矩阵,则必须将其转换回矩阵,但对我来说,想到解决同一问题的不同方法会很有趣。我从这种方法中受益匪浅。关于data.table的更多内容: data.table