R在矩阵中每行返回唯一值

时间:2015-10-28 10:31:22

标签: r matrix filtering

我有一个我想要应用条件的结构,并且每行只返回1个值。

> blah
     [,1] [,2]
[1,]    5    5
[2,]    6    9
[3,]    9    4
[4,]    5    1
[5,]    7    1

假设,我的条件是blah == 5

> blah.tf
      [,1]  [,2]
[1,]  TRUE  TRUE
[2,] FALSE FALSE
[3,] FALSE FALSE
[4,]  TRUE FALSE
[5,] FALSE FALSE

我想要一个只返回每行第一个TRUE值的函数,否则返回NA。

所以我的返回结果是c(5,NA,NA,5,NA)。我无法弄清楚如何应用这个简单的基于行的过滤器。

blah <- structure(c(5L, 6L, 9L, 5L, 7L, 5L, 9L, 4L, 1L, 1L), .Dim = c(5L,2L))

blah.tf <- structure(c(TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE), .Dim = c(5L, 2L))

为清晰起见编辑 -

这个问题措辞不当。条件是可变的而不是静态的。

假设条件为blah.tf <- (blah >= 4 & blah <= 6)。这将返回

的T / F列
> blah.tf
      [,1]  [,2]
[1,]  TRUE  TRUE
[2,]  TRUE FALSE
[3,] FALSE  TRUE
[4,]  TRUE FALSE
[5,] FALSE FALSE

我想返回符合条件行的blah的第一个值的向量。对于新条件,值为c(5,6,4,5,NA)

1 个答案:

答案 0 :(得分:3)

我们可以将'blah'与5进行比较以创建逻辑矩阵,获取!=0,转换为逻辑向量(ifelse并使用ifelse(rowSums(blah==5)!=0, 5, NA) 将TRUE转换为5以及其他到NA。

ifelse

或者@DavidArenburg建议,我们不需要(NA^!rowSums(blah == 5))*5

max.col

更新

使用更新的条件,我们可以使用NA^!rowSums(ind)来获取每一行中第一个TRUE元素的列索引(如果该行只有FALSE,我们可以使用cbind创建NA),{ {1}}使用行索引并从'blah'中提取元素。

ind <- (blah >=4) & (blah <= 6)
blah[cbind(1:nrow(ind), max.col(ind, 'first')* NA^!rowSums(ind))]
#[1]  5  6  4  5 NA