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

R 输出矩阵中每列的第一个元素的行索引,以满足逻辑条件,r,indexing,match,R,Indexing,Match,我有一个包含数字数据的大矩阵(8000 x 8000)。我想要一个输出矩阵,其中一行包含每列中第一个元素的行索引,以满足逻辑运算符的要求。请注意,并非所有列都有满足条件的元素 输入示例: Column Row 1 2 3 4 1 34.349 23.642 64.321 12.320 2 74.734 11.755 29.424 55.432

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

输入示例:

    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新手,很难使用标准匹配和哪些函数来获得此输出。

因为,它是一个矩阵,我们可以使用
应用
,并且
边距=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的元素时,它会失败。因此,请检查
if
any
条件

这也适用于dataframe


若并没有大于70的元素,且列具有
NA
值,则返回一个错误

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

你也可以使用
Position
,它应该比
which快。max
@PoGibas实际上以前没有使用
Position
函数:)我用8e3x8e3矩阵上的microbenchmark快速检查过,它更快,但我不知道它如何处理未找到的(
NA
)值。你好,Ronak,是否可以修改代码以处理包含NA值的矩阵?当应用于具有NA值的矩阵时,获取以下错误消息:“if(any(x))which.max(x)else NA中出错:缺少值,其中为TRUE/FALSEneeded@Jdj67它应该仍然有效。我刚刚做了
mat[1,1]
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