【发布时间】:2010-12-07 06:23:53
【问题描述】:
我有一个大型数据集(202k 点)。我知道有 8 个超过 0.5 的值。我想对这些行进行子集化。
如何查找/返回值 > 0.5 的行号列表?
【问题讨论】:
-
你已经去掉了 R 标签。那你用什么语言工作?如果没有环境的一些迹象,这个问题就无法回答。
我有一个大型数据集(202k 点)。我知道有 8 个超过 0.5 的值。我想对这些行进行子集化。
如何查找/返回值 > 0.5 的行号列表?
【问题讨论】:
如果数据集是一个名为x的向量:
(1:length(x))[x > 0.5]
如果数据集是名为x 的data.frame 或矩阵,并且感兴趣的变量在j 列中:
(1:nrow(x))[x[,j] > 0.5]
但是,如果您只想找到子集而不真的需要行号,请使用
subset(x, x > 0.5)
对于一个向量和
subset(x, x[,j] > 0.5)
对于矩阵或 data.frame。
【讨论】:
which(x > 0.5)
【讨论】:
这是一些虚拟数据:
D<-matrix(c(0.6,0.1,0.1,0.2,0.1,0.1,0.23,0.1,0.8,0.2,0.2,0.2),nrow=3)
看起来像:
> D
[,1] [,2] [,3] [,4]
[1,] 0.6 0.2 0.23 0.2
[2,] 0.1 0.1 0.10 0.2
[3,] 0.1 0.1 0.80 0.2
这是逻辑行索引,
index <- (rowSums(D>0.5))>=1
你可以用它来提取你想要的行:
PeakRows <- D[index,]
看起来像这样:
> PeakRows
[,1] [,2] [,3] [,4]
[1,] 0.6 0.2 0.23 0.2
[2,] 0.1 0.1 0.80 0.2
【讨论】:
使用参数arr.ind=TRUE 和which 是查找条件为TRUE 的行(或列)号的好方法,
df <- matrix(c(0.6,0.2,0.1,0.25,0.11,0.13,0.23,0.18,0.21,0.29,0.23,0.51), nrow=4)
# [,1] [,2] [,3]
# [1,] 0.60 0.11 0.21
# [2,] 0.20 0.13 0.29
# [3,] 0.10 0.23 0.23
# [4,] 0.25 0.18 0.51
which 和arr.ind=TRUE 返回条件为TRUE 的数组索引
which(df > 0.5, arr.ind=TRUE)
row col
[1,] 1 1
[2,] 4 3
所以子集变成了
df[-which(df > 0.5, arr.ind=TRUE)[, "row"], ]
# [,1] [,2] [,3]
# [1,] 0.2 0.13 0.29
# [2,] 0.1 0.23 0.23
【讨论】: