【问题标题】:Output row index of first element of every column in a matrix to satisfy a logical condition输出矩阵中每一列的第一个元素的行索引以满足逻辑条件
【发布时间】:2019-03-09 14:42:20
【问题描述】:

我有一个包含数值数据的大矩阵 (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 新手,很难使用标准匹配和哪些函数来获得此输出。

【问题讨论】:

    标签: r indexing match


    【解决方案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 的缺失值

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

    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 
    

    【讨论】:

    • 你也可以Position,应该比which.max
    • @PoGibas 实际上之前没有使用过Position 函数:)
    • 我用微基准快速检查了 8e3x8e3 矩阵,速度更快,但我不知道它如何处理未找到的 (NA) 值。
    • 嗨 Ronak,可以修改代码以处理包含 NA 值的矩阵吗?应用于具有 NA 值的矩阵时出现以下错误消息:'if (any(x)) which.max(x) else NA 中的错误:需要 TRUE/FALSE 的缺失值
    • @Jdj67 它应该仍然有效。我刚刚对您的示例做了mat[1, 1] &lt;- NA,它仍然给我相同的输出。
    猜你喜欢
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    相关资源
    最近更新 更多