满足逻辑条件的矩阵中每一列的第一元素的输出行索引

时间:2018-10-04 08:55:09

标签: r indexing match which

我有一个包含数值数据的大矩阵(8,000 x 8,000)。我想要一个输出矩阵,其中有一行包含每一列中第一个元素的行索引,以满足逻辑运算符。请注意,并非所有列都具有满足条件的元素。

示例输入:

    Column
Row   1         2          3          4          
 1  34.349    23.642     64.321     12.320      
 2  74.734    11.755     29.424     55.432     
 3  31.345    99.328     64.236     45.453     
 4  22.436    84.345     45.323     21.008     
 5  7.323    101.324     45.254     32.233      
 6  119.345  23.324      72.474     53.543

逻辑运算符:x> 70提供了以下示例输出:

    Column
Row   1         2          3          4
 1    2         3          6          NA

我是R的新手,并努力使用标准match和哪个函数来获得此输出。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

因为这是一个矩阵,我们可以将applymargin = 2一起使用(列方式)。在这里,我们检查该列是否具有至少一个大于70的值并返回其索引,否则返回NA。

apply(mat > 70, 2, function(x) if (any(x)) which.max(x) else NA)

#V1 V2 V3 V4 
# 2  3  6 NA 

理想情况下,apply(mat > 70, 2, which.max)会给您所需的内容,但是当您没有大于70的元素时会失败,因此,检查条件为ifany

这也适用于数据框。


如果没有大于70的元素并且列具有NA值,则它将返回错误。

mat[1, 4] <- NA
apply(mat > 70, 2, function(x) if (any(x)) which.max(x) else NA)
  

if(any(x))which.max(x)else错误:NA:     缺少需要TRUE / FALSE的值

在这种情况下,我们可以在na.rm中使用any参数来避免此错误。

apply(mat > 70, 2, function(x) if (any(x, na.rm = TRUE)) which.max(x) else NA)

#V1 V2 V3 V4 
# 2  3  6 NA