values true r count

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