查找R中列表中的子列表

时间:2014-08-21 01:36:47

标签: r list

我有一个布尔矩阵。大多数行看起来像这样

1 1 1 1 1 0 0 0 0

但其中一些看起来像这样

1 1 1 1 0 0 1 1 1

我想找到那些有0然后是1.我怎么能这样做?我的天真尝试是尝试

c(0, 1) %in% my_list

但返回

[1] TRUE TRUE

因为0和1都在列表中。 D'哦!有什么帮助吗?

2 个答案:

答案 0 :(得分:3)

如何看待差异

x <- c(1,1,1,1,0,0,1,1,1)
1 %in% diff(x)

然后创建一个函数,并apply将其添加到矩阵的行中。

答案 1 :(得分:2)

这可能是毫无意义的,因为另一个答案已经非常快,但是对于非常大的矩阵来说,这将更好地扩展以识别您想要的行。 E.g:

no  <- c(1, 1, 1, 1, 1, 0, 0, 0, 0)
yes <- c(1, 1, 1, 1, 0, 0, 1, 1, 1)

m <- rbind(no,yes,no,yes,no,yes,yes)
#           1   2  3   4  5   6   7 
# result should thus be c(2,4,6,7)

col(t(m[,-1]))[diff(t(m))==1]
#[1] 2 4 6 7

100万行矩阵基准:

m <- m[sample(1:2,1000000,replace=TRUE),]
system.time(apply(m, 1, function(x) 1 %in% diff(x) ))
#   user  system elapsed 
#  12.09    0.00   12.09 
system.time(col(t(m[,-1]))[diff(t(m))==1])
#   user  system elapsed 
#   0.61    0.05    0.65 

@MatthewLundberg建议的替代方案,这可能是速度和可读性的非常好的平衡。

system.time(apply(diff(t(m))==1, 2, any))
#   user  system elapsed 
#   1.85    0.00    1.84