我有一个布尔矩阵。大多数行看起来像这样
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'哦!有什么帮助吗?
答案 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