2017-09-10 5 views
2

J'essaie actuellement de créer des séquences entre des valeurs de vecteurs différents qui n'ont pas la même longueur.Créer une séquence entre certaines valeurs sur deux vecteurs

Imaginer que j'ai les deux vecteurs suivants a et b:

a<-c(1, 8, 14, 34, 46, 55) 
b<-c(3, 6, 12, 13, 18, 42, 49, 50, 57, 200) 

Je voudrais générer un troisième vecteur qui montre les séquences entre les valeurs de a et la prochaine valeur la plus élevée de b (ici: 1:3 comme 1,2,3; 8:12 comme 8,9,10,11,12; 14:18 comme 14,15,16,17,18 et ainsi de suite jusqu'à ce que finalement 55:57 soit 55,56,57).

L'utilisation de mapply n'a pas donné les résultats souhaités.

Répondre

6

Nous pouvons utiliser findInterval au sous-ensemble le « b » sur la base de la valeur de « a » et ensuite avec Map obtenir la séquence correspondante (:=) entre les éléments de la « A » et les éléments de sous-ensemble de « b »

Map(`:`, a, b[findInterval(a, b) + 1]) 
#[[1]] 
#[1] 1 2 3 

#[[2]] 
#[1] 8 9 10 11 12 

#[[3]] 
#[1] 14 15 16 17 18 

#[[4]] 
#[1] 34 35 36 37 38 39 40 41 42 

#[[5]] 
#[1] 46 47 48 49 

#[[6]] 
#[1] 55 56 57 
+0

Bonjour, j'ai une demande supplémentaire en retard: le code a travaillé très bien pour 95% de mes données. Cependant, dans certains cas (données d'entrée de la même structure que précédemment), le code entraîne une erreur dans .Primitive (":") (points [[1L]] [[26L]], points [[2L]] [ [26L]]): NA/NaN Argument "sortie. Je ne peux pas voir pourquoi. "NA/NaN Argument" semble dire qu'il n'y a pas de données à traiter, mais j'ai vérifié les étapes précédentes manuellement. Avez-vous une explication pour cela? – sant

+0

@sant Pourriez-vous vérifier s'il y a des cas où seulement NA/NaN. Dans ce cas, utilisez une condition 'if/else' pour prendre soin de cela – akrun

+0

Oui, il y a des listes entières qui ne fonctionnent pas. Prenez par exemple a et b de la publication initiale: je cours deux listes structurées de manière similaire, et le résultat est l'erreur NA/NaN. Pouvez-vous spécifier de quelle manière vous incluez une condition if/else? Je vous remercie! – sant

4
lapply(a, function(x) x:b[b>x][1]) 
#[[1]] 
#[1] 1 2 3 

#[[2]] 
#[1] 8 9 10 11 12 

#[[3]] 
#[1] 14 15 16 17 18 

#[[4]] 
#[1] 34 35 36 37 38 39 40 41 42 

#[[5]] 
#[1] 46 47 48 49 

#[[6]] 
#[1] 55 56 57