在R中有效地提取逻辑矩阵中每行的第一个TRUE [英] Extract the first TRUE per row in logical matrix efficiently in R

查看:183
本文介绍了在R中有效地提取逻辑矩阵中每行的第一个TRUE的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

给出以下矩阵:

         A     B    C
[1,]  TRUE FALSE TRUE
[2,] FALSE  TRUE TRUE
[3,] FALSE FALSE TRUE
[4,] FALSE  TRUE TRUE
[5,] FALSE  TRUE TRUE
[6,]  TRUE  TRUE TRUE

m <- structure(c(TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, 
FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE), .Dim = c(6L, 
3L), .Dimnames = list(NULL, c("A", "B", "C")))

如何高效地提取每行TRUE值的第一列??当然,我们可以在每行使用apply,然后获取min(which(...)).

How we can extract the first column with TRUE value per row efficiently? Of course, we could use apply per row and then get the min(which(...)).

这是所需的输出:

[1] A B C B B A

此线程可能与我的问题重复,但并非如此:

This thread might seem a duplicate of my question but its not:

  1. 在这里,我们谈论的是逻辑矩阵,而不是数字数据框
  2. 这里我们试图获取第一个TRUE的位置而不是最高值
  1. Here we are talking about a logical matrix NOT a numeric data frame
  2. Here we seek to get the position of the first TRUE not the highest value

推荐答案

我们可以使用max.col

colnames(m)[max.col(m, "first")]
#[1] "A" "B" "C" "B" "B" "A"

如果连续没有TRUE,则可以将其更改为NA(如果需要)

If there are no TRUE in a row, then we can change it to NA (if needed)

colnames(m)[max.col(m, "first")*NA^!rowSums(m)]

或使用ifelse

colnames(m)[ifelse(rowSums(m)==0, NA, max.col(m, "first"))]

这篇关于在R中有效地提取逻辑矩阵中每行的第一个TRUE的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆