根据阈值选择R中的行

时间:2017-03-22 07:51:03

标签: r matrix dataframe subset

在R中,我有一个矩阵,其中包含所有数字的N列。 (每行都有一个名称,但这是无关紧要的。)我想返回至少有一列值大于某个阈值的行。现在,我正在做这样的事情:

THRESHOLD <- 10
#  my_matrix[,1] can be ignored
my_matrix <- subset (my_matrix, my_matrix[,1] > THRESHOLD | my_matrix[,2] > THRESHOLD | ... )

必须手动列出每列似乎很奇怪。此外,如果输入列的数量发生变化,我必须重写它。

必须有更好的方法,但我无法弄清楚我应该寻找什么。

我可以将矩阵转换为数据框,如果这更容易......任何建议都会受到赞赏!

1 个答案:

答案 0 :(得分:1)

使用apply查找任何大于阈值的行值,并使用它从mat数据中提取行。

mat[apply( mat2, 1, function( x ) any( x > threshold ) ), ]

修改

分解上述单行。

# create sample data by simulating samples from standard normal distribution
set.seed(1L)   # set random number generator for consistent data simulation

mat <- matrix( data = c(letters[1:3], as.character( rnorm(9, mean = 0, sd = 1))),
               byrow = FALSE, 
               nrow = 3, 
               ncol = 4 ) # create simulated data matrix

threshold <- 0  # set threshold

mat2 <- apply( mat[, 2:ncol(mat) ], 2, as.numeric )  # extract columns 2 to end and convert to numeric

# Get the logical indices (true or false) if any row has values greater than 0 (threshold)
row_indices <- apply( mat2, 1, function( x ) any( x > threshold ) )

mat[row_indices, ]  # extract matrix data rows that has TRUE in row_indices
#     [,1]                 [,2]                 [,3]                 [,4]               
# [1,] "a"  "-0.626453810742332" "1.59528080213779"   "0.487429052428485"
# [2,] "b"  "0.183643324222082"  "0.329507771815361"  "0.738324705129217"
# [3,] "c"  "-0.835628612410047" "-0.820468384118015" "0.575781351653492"

注意:

在你的问题中,你提到第一列是字符,其余是数字。按规则,矩阵可以保存一种数据类型。鉴于此信息,我假设您的数据矩阵是字符数据类型。您可以使用class(mat)找到它。如果是字符矩阵,则将列2提取为结束,然后将其转换为数字。然后在apply循环中使用它来检查任何大于阈值的值。