7
votes

Créer des groupes du vecteur de 0,1 et na

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)

r

2 commentaires

Je ne comprends pas bien exactement comment vous obtenez votre Vecteur POS 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.


4 Réponses :


2
votes

Coller la séquence dans une chaîne et en utilisant une boucle tandis que vérifie (avec 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: xxx pré>

alors vous pouvez utiliser GREGEXPR Pour obtenir les indices de 1s. P> xxx pré>

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 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


0 commentaires

3
votes

Vous pouvez utiliser na.locf à partir du package zoo : xxx


3 commentaires

Pour la tabulation, do Tabulate (résultat, NBINS = Longueur (x)) résultat = index (v) [v == 1]


qui (zoo :: na.locf (c (0l, x)) [- 1L] == 1L) pendant environ 4 fois plus vite


@rawr a ajouté votre solution à mes repères, bel ajout.



3
votes
[1] 0 0 0 0 0 1 0 1 1 1 1 0 0 0 1 1 1 0

1 commentaires

Je jouais aussi avec une solution utilisée rle je ne pouvais pas vraiment le faire trier. J'aime cette idée cependant.



4
votes
## 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

2 commentaires

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 () . 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.