2017-10-20 5 views
-2

Je saisis un vecteur vec<-c(2 3 4 8 10 12 15 19 20 23 27 28 39 47 52 60 64 75), et la taille des intervalles que je veux casser les entrées de vecteur dans.Diviser un vecteur dans R en fonction des entrées

Dans cet exemple, je veux décomposer ceci en 9 vecteurs différents en fonction de la taille de chaque entrée. Dans mon cas, je veux le numéro de vecteur 1 à être entrées dans l'intervalle [1,9], puis vecteur 2 pour être entrées dans [10,18] ... ect

En d'autres termes:

vec1: 2 3 4 8 
vec2: 10 12 15 
vec3: 19 20 23 27 

ect ...

J'ai essayé d'utiliser la fonction split mais je ne sais pas comment définir un ratio qui fonctionnera.

+0

* ... en fonction de la taille de chaque entrée * - ce que d oes ça veut dire? Veuillez expliquer plus en détail comment vous obtenez de 'vec' à la sortie. –

+0

Je suggérerais d'utiliser la division entière pour déterminer quel vecteur appartient à chacun dans% /% 'est l'opérateur. – Mako212

+0

Bien sûr, je voudrais entrer un vecteur, et une taille d'intervalle, et la sortie sera un certain nombre de vecteurs avec des entrées dans ces intervalles d'augmentation. Dans l'exemple ci-dessus, j'ai choisi des intervalles de [1,9], [10,18], ... – user7512228

Répondre

0

utilisation division entière %/% pour retourner un vecteur de quel groupe appartient chaque valeur. Puis split dans des vecteurs séparés. Utilisez (vec-1) être "inclusive", à savoir 27 va avec le groupe 3, non groupe 4.

split(vec,(vec-1) %/% 9) 

Edit:

Une autre façon en utilisant dplyr et cut qui balises explicitement chaque intervalle

require(dplyr) 

vec <- as.data.frame(vec) 

df2 %>% mutate(interval = cut(vec,breaks=seq(0,((max(vec) %/% 9) +1) * 9,9),include.lowest=TRUE,right=TRUE)) 

    vec interval 
1 2 [0,9] 
2 3 [0,9] 
3 4 [0,9] 
4 8 [0,9] 
5 10 (9,18] 
6 12 (9,18] 
7 15 (9,18] 
8 19 (18,27] 
9 20 (18,27] 
10 23 (18,27] 
11 27 (18,27] 
+1

Je pense qu'il devrait être 'split (vec, (vec -1)% /% 9)' comme dans mon cas je commence mon premier intervalle à 1 plutôt que 0 – user7512228

+0

@ user7512228 Oui, fixé. J'ai raté que c'était "inclusif" le 27. – Mako212

1

Peut-être que ce qui suit fera ce que vous voulez.

f <- cut(vec, seq(0, max(vec), by = 9), include.lowest = TRUE) 
sp <- split(vec, f) 
sp <- sp[sapply(sp, function(x) length(x) != 0)] 
sp 
0

peut-être cela

library(purrr) 
vec <- c(2, 3, 4, 8, 10 ,12, 15 ,19, 20, 23, 27, 28, 39, 47, 52, 60, 64, 75) 

vec1 <- keep(vec, function(x) x >= 1 & (x) <= 9) 
vec2 <- keep(vec, function(x) x >= 10 & (x) <= 18)