Contexte:
J'essaie de supprimer un corpus où l'orateur est identifié. J'ai réduit le problème de la suppression d'un haut-parleur particulier de la corpeuse au flux suivant de 1,0, et de NA (x). 0 signifie que la personne parle, 1 quelqu'un d'autre parle, NA signifie que quiconque était le dernier orateur parlant toujours. P>
Voici un exemple visuel: p>
fill <- c(0,0,0,0,0,1,0,1,1,1,1,0,0,0,1,1,1,0)
4 Réponses :
Coller la séquence dans une chaîne et en utilisant une boucle tandis que vérifie (avec alors vous pouvez utiliser ou vous pouvez diviser la chaîne et regarder pour trouver les indices de 1s dans le vecteur résultant: p> xxx pré> à l'aide de grep code>) s'il existe un na code> S précédé de 1 code> s et substituts (avec gsub code>) de tels cas avec un 1 code> le feront: GREGEXPR Pour obtenir les indices de 1s. P>
stri_flatten > à partir du package stringi code> au lieu de coller code> et et stri_locate_all_fixed code> plutôt que gregexpr code> ou un itinéraire de scission de chaîne peut fournir un peu plus de performances s'il s'agit d'un vecteur plus grand que vous traitez. Si le vecteur n'est pas grand, aucun gain de performance ne vous résultera. P> x[is.na(x)] <- "N"
stringx <- stri_flatten(x)
ones <- stri_locate_all_regex(stringx, "1N*")[[1]]
#[[1]]
#
# start end
#[1,] 6 6
#[2,] 8 11
#[3,] 15 17
unlist(lapply(seq_along(ones[, 1]),
function(ii) seq.int(ones[ii, "start"], ones[ii, "end"])))
#[1] 6 8 9 10 11 15 16 17
Vous pouvez utiliser na.locf code> à partir du package code> zoo code>:
Pour la tabulation, do Tabulate (résultat, NBINS = Longueur (x)) Code> où résultat = index (v) [v == 1] code>
qui (zoo :: na.locf (c (0l, x)) [- 1L] == 1L) code> pendant environ 4 fois plus vite
@rawr a ajouté votre solution à mes repères, bel ajout.
[1] 0 0 0 0 0 1 0 1 1 1 1 0 0 0 1 1 1 0
Je jouais aussi avec une solution utilisée rle code> je ne pouvais pas vraiment le faire trier. J'aime cette idée cependant.
## scale test, low probability of NA set.seed(1L); N <- 1e5L; probNA <- 0.2; x <- sample(c(NA,T),N,T,c(probNA,1-probNA)); x[which(x)] <- rep(c(0,1),len=sum(x,na.rm=T)); ex <- bgoldst(x); identical(ex,user31264(x)); ## [1] TRUE microbenchmark(bgoldst(x),user31264(x)); ## Unit: milliseconds ## expr min lq mean median uq max neval ## bgoldst(x) 5.24815 6.351279 7.723068 6.635454 6.923264 45.04077 100 ## user31264(x) 11.79423 13.063710 22.367334 13.986584 14.908603 55.45453 100
Intéressant. Vous savez, j'ai été payé pour écrire R code pendant plus de 7 ans maintenant et je ne comprends toujours pas FindInterval () code>. Cela semble être la meilleure réponse du groupe, mais une explication de votre code de solutions pourrait être utile pour Passerby.
@JOTA Nice addition. A également ajouté la solution de RAWR.
Je ne comprends pas bien exactement comment vous obtenez votre
Vecteur POS code> Vecteur. Pourriez-vous expliquer un peu plus exactement ce que vous voulez?J'ai essayé de le mettre à jour avec un exemple visuel de mon problème.