Je voudrais savoir pour combien de lignes un nombre est apparu dans une colonne consécutivement et mettre ce nombre dans une matrice pour chaque occurrence.

Par exemple, je voudrais utiliser cette entrée pour trouver toutes les occurrences -1 consécutives

df$V1

0
1
0
-1
-1
0
1
-1
-1
-1
1

Le nombre de lignes que les -1 consécutifs ont trouvé:

output
2
3

Tout ce que je pouvais penser à faire était de parcourir chaque ligne et de voir si un -1 s'était produit dans la ligne ci-dessus et était également un -1 dans la ligne actuelle, puis ajoutez-le au compteur. Mais j'imagine qu'il doit y avoir un moyen plus rapide de le faire?

2
user3324491 20 avril 2017 à 18:21

3 réponses

Meilleure réponse

Utilisez rle

x = c(0L, 1L, 0L, -1L, -1L, 0L, 1L, -1L, -1L, -1L, 1L)    
with(rle(x), lengths[values == -1])
#[1] 2 3

Pour tous les unique éléments de x

with(rle(x), setNames(sapply(unique(values), function(x)
                lengths[values == x]), nm = unique(values)))
#$`0`
#[1] 1 1 1

#$`1`
#[1] 1 1 1

#$`-1`
#[1] 2 3
2
d.b 20 avril 2017 à 15:31

Pour toutes les valeurs, nous pouvons le faire avec rleid de data.table

library(data.table)
res <- setDT(df)[, .(value = V1[1L], n = .N), .(grp = rleid(V1))]
res
#   grp value n
#1:   1     0 1
#2:   2     1 1
#3:   3     0 1
#4:   4    -1 2
#5:   5     0 1
#6:   6     1 1
#7:   7    -1 3
#8:   8     1 1

À partir de là, nous pouvons sous-ensembles les éléments où 'V1' est -1

res[value== -1][, grp := NULL][]
#   value n
#1:    -1 2
#2:    -1 3

Les données

df <- structure(list(V1 = c(0L, 1L, 0L, -1L, -1L, 0L, 1L, -1L, -1L, 
-1L, 1L)), .Names = "V1", row.names = c(NA, -11L), class = "data.frame")
0
akrun 20 avril 2017 à 15:28

Vous pouvez le faire dans la base R:

r <- x==-1
diff(unique(cumsum(r)[!r]))
#[1] 2 3

x <- df$V1.

0
989 20 avril 2017 à 15:41