true - ¿Cómo contar el número de dos observaciones de combinaciones binarias?
r group by count (4)
Otra solución sería esta:
library(stringr)
x <- c(1,0,0,1,0,0,0,1,1,1,0,0,1,0,1,0,1,0,1,0,1,0)
xx = paste0(x, collapse = "")
str_count(xx, ''(?<=010)'')
[1] 6
str_count(xx, ''(?<=1010)'')
[1] 4
Como @Pierre Lafortune señaló en los comentarios que esto se puede hacer sin usar ningún paquete:
length(gregexpr("(?<=010)", xx, perl=TRUE)[[1]])
[1] 6
En el siguiente ejemplo, me gustaría saber el número de secuencias 010
o el número de 1010
secuencias. A continuación se muestra un ejemplo viable;
x <- c(1,0,0,1,0,0,0,1,1,1,0,0,1,0,1,0,1,0,1,0,1,0)
En este ejemplo, el número de secuencias 010
sería 6 y el número de secuencias 1010
sería 4.
¿Cuál sería la forma más eficiente / simple de contar el número de secuencias consecutivas?
R introdujo la función startsWith
en 3.3.0. Usando esto y la substring
, podemos implementar el método de @ joel.wilson como
sum(startsWith(substring(paste(x, collapse=""),
head(seq_along(x), -2), tail(seq_along(x), -2)), "010"))
Aquí, substring
construye los tres caracteres adyacentes establece y startsWith
pruebas si cada uno de estos es el mismo que "010". Los valores TRUE se suman.
Una forma sin cadena:
f = function(x, patt){
if (length(x) == length(patt)) return(as.integer(x == patt))
w = head(seq_along(x), 1L-length(patt))
for (k in seq_along(patt)) w <- w[ x[w + k - 1L] == patt[k] ]
w
}
length(f(x, patt = c(0,1,0))) # 6
length(f(x, patt = c(1,0,1,0))) # 4
Alternativas. Desde @ cryo11, aquí hay otra forma:
function(x,patt) sum(apply(embed(x,length(patt)),1,function(x) all(!xor(x,patt))))
u otra variación:
function(x,patt) sum(!colSums( xor(patt, t(embed(x,length(patt)))) ))
o con data.table:
library(data.table)
setkey(setDT(shift(x, seq_along(patt), type = "lead")))[as.list(patt), .N]
(La función de shift
es muy similar a la embed
).
lógica: tome un substrato de la longitud del patrón que está buscando y compárelo con el patrón.
xx = paste0(x, collapse = "")
# [1] "1001000111001010101010"
# case 1 :
xxx = "010"
sum(sapply(1:(length(x)-nchar(xxx)+1), function(i) substr(xx,i,i+nchar(xxx)-1)==xxx))
# [1] 6
# case 2 :
xxx = "1010"
# [1] 4