【问题标题】:Selecting rows in R based on threshold根据阈值选择 R 中的行
【发布时间】:2017-03-22 07:51:03
【问题描述】:

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

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

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

必须有更好的方法,但我不知道我应该寻找什么。

如果这更容易的话,我可以将我的矩阵转换为数据框...任何建议将不胜感激!

【问题讨论】:

  • 请展示一个可重现的示例,包括预期的输出。
  • mat[apply( mat[, 2:ncol(mat)], 1, function( x ) any( x &gt; threshold ) ), ] mat 是你的矩阵数据
  • my_matrix[apply(as.matrix(my_matrix[-1,])&gt;THRESHOLD, 1, any),]
  • 矩阵可以保存数字异或字符,但不能同时保存。这是什么意思第一列是字符串,但其他列是数字:第一列是行名或您的数字存储为字符,例如“3.14”。请编辑您的问题:stackoverflow.com/posts/42945642/edit
  • @Sathish 谢谢你;我会试一试。随时发布解决方案,以便我接受。事实证明,我不知道“应用”可以这样使用。这就是我一直在寻找的......

标签: r matrix dataframe subset


【解决方案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(data, 1, function),那么您将按行循环。如果您有apply(data, 2, function),那么您将按列循环。第二个参数MARGIN 确定您是要按行还是按列循环。希望这会有所帮助
  • 哇!非常感谢这么详细的解释!是的,我现在 [终于] 明白了你所说的矩阵包含一种数据类型是什么意思。就我而言,“第一列”是行名。显然我不太了解矩阵数据类型。尽管如此,您并没有让我重新编辑我的问题,而是给了我一个可行的解决方案。这次真是万分感谢!既然我明白了你的意思,我会回过头来为其他人更好地澄清我的问题。再次感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 1970-01-01
  • 2020-03-22
  • 2014-05-13
  • 1970-01-01
相关资源
最近更新 更多