在R中有效地提取逻辑矩阵中每行的第一个TRUE [英] Extract the first TRUE per row in logical matrix efficiently in R
本文介绍了在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:
- 在这里,我们谈论的是逻辑矩阵,而不是数字数据框
- 这里我们试图获取第一个TRUE的位置而不是最高值
- Here we are talking about a logical matrix NOT a numeric data frame
- 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屋!
查看全文