我有一个我想要应用条件的结构,并且每行只返回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)
。这将返回
> 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)
。
答案 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