在R中,我有一个矩阵,其中包含所有数字的N列。 (每行都有一个名称,但这是无关紧要的。)我想返回至少有一列值大于某个阈值的行。现在,我正在做这样的事情:
THRESHOLD <- 10
# my_matrix[,1] can be ignored
my_matrix <- subset (my_matrix, my_matrix[,1] > THRESHOLD | my_matrix[,2] > THRESHOLD | ... )
必须手动列出每列似乎很奇怪。此外,如果输入列的数量发生变化,我必须重写它。
必须有更好的方法,但我无法弄清楚我应该寻找什么。
我可以将矩阵转换为数据框,如果这更容易......任何建议都会受到赞赏!
答案 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循环中使用它来检查任何大于阈值的值。