7
votes

Comment trouver des nombres consécutifs parmi plusieurs tableaux?

J'ai tout de suite donner un exemple, Supposons maintenant que j'ai 3 tableaux A, B, C tels que

c(1,2,3),c(4,5,6)


2 commentaires

Chaque élément d'un triplet est-il à venir de différents tableaux? {2,3,4} être considéré comme un triplet valide?


Oui! , {2,3,4}, {6,7,8} ou {7,8,9} n'est pas valide.


4 Réponses :


5
votes

Voici une approche. Cela suppose qu'il n'y a pas de pauses dans la séquence d'observations dans le nombre de groupes. Ici, les données.

lapply(which(idx), function(i) {
    dd[i:(i+N-1),]
})

# [[1]]
#    data which
# b2    1     b
# c2    2     c
# a1    3     a
# 
# [[2]]
#    data which
# c1    4     c
# a2    5     a
# b1    6     b


1 commentaires

Cela a parfaitement travaillé pour l'exemple donné. Mais pourriez-vous m'aider à former un groupe comme je n'ai 'n' nombre de tableaux, tout comme une liste dans une liste.



2
votes

Voici une méthode de force brute avec expand.grid et trois vecteurs comme dans l'exemple xxx

à l'aide de COMMUN pour calculer la différence Pour chaque combinaison paires. xxx


2 commentaires

Vous avez des idées pour réussir la méthode «N» dans expand.grid ()?


Je viens d'essayer et expand.grid acceptera une liste de vecteurs. Vous pouvez collecter les vecteurs dans une liste à l'aide de mget et ls . Jouez autour de ma réponse à Cet article à construire une telle liste.



7
votes

Réorganiser les données d'abord dans une liste contenant le numéro de valeur et de tableau. Trier la liste; Vous auriez une smth comme: xxx

en boucle de la liste, vérifiez s'il y a des numéros consécutifs réellement, puis vérifiez si ceux-ci avaient des numéros de tableau différents


1 commentaires

Grande idée (avancée), il pourrait y avoir une seule difficulté si le même numéro est dans plusieurs vecteurs, mais il est facile d'adapter la solution à rendre compte de cela :)



1
votes

J'ai piraté une petite fonction récursive qui trouvera tous les triplets consécutifs entre autant de vecteurs que vous le transmettez (devez passer au moins trois). C'est probablement un peu brut, mais semble travailler.

La fonction utilise l'ellipsis, ... code>, pour les arguments de passage. Par conséquent, il faudra toutefois de nombreux arguments (c'est-à-dire des vecteurs numériques) que vous fournissez et les mettre dans la liste éléments code>. Ensuite, la plus petite valeur parmi chaque vecteur passé est située, avec son index. p>

Ensuite, les indeces des vecteurs correspondant au plus petit triplet sont créés et itératés à l'aide d'une boucle pour () code>, où les valeurs de sortie sont transmises au vecteur de sortie out code>. Les vecteurs d'entrée dans éléments code> sont éliminés et passés à nouveau dans la fonction de manière récursive. Seulement, lorsque tous les vecteurs sont na code>, c'est-à-dire qu'il n'y a plus de valeurs dans les vecteurs, la fonction renvoie le résultat final. P> xxx pré>

la fonction peut être appelé en passant les vecteurs d'entrée comme arguments. p> xxx pré>

Le résultat est une liste, qui contient toutes les informations nécessaires, bien que non ordonnées. P>

a<-c(6,7,11)
b<-c(8,9,13)
c<-c(10,12,14)

y <- tripl(a,b,c)
sapply(y, function(x){x[order(x)]}) %>% t
#     [,1] [,2] [,3]
# [1,]    6    8   10
# [2,]    7    9   12
# [3,]   11   13   14


0 commentaires