Je dois diviser un vecteur en n morceaux de taille égale dans R. Je n'ai trouvé aucune fonction de base pour le faire. De plus, Google ne m'a conduit nulle part. Voici donc ce que j'ai trouvé, j'espère que cela aidera quelqu'un quelque part.
x <- 1:10
n <- 3
chunk <- function(x,n) split(x, factor(sort(rank(x)%%n)))
chunk(x,n)
$`0`
[1] 1 2 3
$`1`
[1] 4 5 6 7
$`2`
[1] 8 9 10
Tous les commentaires, suggestions ou améliorations sont vraiment les bienvenus et appréciés.
À la vôtre, Sebastian
x <- c(NA, 4, 3, NA, NA, 2, 1, 1, NA ); y <- letters[x]; z <- factor(y)
donne des exemples avec des données manquantes, des valeurs répétées, qui ne sont pas déjà triées et qui sont dans différentes classes (entier, caractère, facteur).Réponses:
Un doublure divisant d en morceaux de taille 20:
Plus de détails: je pense que tout ce dont vous avez besoin est
seq_along()
,split()
etceiling()
:la source
n
morceaux de taille égale. Cela vous donne un nombre inconnu de morceaux de taillen
. J'ai eu le même problème et j'ai utilisé les solutions de @mathheadinclouds.n-chunks
j'ai utilisémax <- length(d)%/%n
. Je l'ai utilisé avec un vecteur de 31 chaînes et j'ai obtenu une liste de 3 vecteurs de 10 phrases et un de 1 phrase.la source
la source
Essayez la fonction ggplot2,
cut_number
:la source
x
,y
ouz
défini dans ce commentaire . En particulier, il trie les résultats, qui peuvent être corrects ou non, selon l'application.Cela le divisera différemment de ce que vous avez, mais c'est toujours une belle structure de liste, je pense:
Ce qui vous donnera les éléments suivants, selon la façon dont vous souhaitez le mettre en forme:
Exécution de deux synchronisations à l'aide de ces paramètres:
Ensuite, nous avons les résultats suivants:
EDIT: Le passage de as.factor () à as.character () dans ma fonction l'a rendu deux fois plus rapide.
la source
Quelques variantes de plus à la pile ...
Notez que vous n'avez pas besoin d'utiliser la
factor
fonction ici, mais que vous souhaitez toujours affichersort
votre premier vecteur1 2 3 10
:Ou vous pouvez attribuer des indices de caractères, et non les nombres dans les cases à gauche ci-dessus:
Ou vous pouvez utiliser des noms en mots simples stockés dans un vecteur. Notez que l'utilisation
sort
pour obtenir des valeurs consécutives enx
ordre alphabétique les étiquettes:la source
Utilisation des R de base
rep_len
:Et comme déjà mentionné si vous voulez des indices triés, simplement:
la source
Vous pouvez combiner le split / cut, comme suggéré par mdsummer, avec le quantile pour créer des groupes pairs:
Cela donne le même résultat pour votre exemple, mais pas pour les variables asymétriques.
la source
split(x,matrix(1:n,n,length(x))[1:length(x)])
c'est peut-être plus clair, mais la même idée:
split(x,rep(1:n, ceiling(length(x)/n),length.out = length(x)))
si vous voulez qu'il soit commandé, jetez-en une sorte
la source
J'avais besoin de la même fonction et j'ai lu les solutions précédentes, mais j'avais aussi besoin d'avoir le morceau déséquilibré pour être à la fin, c'est-à-dire si j'ai 10 éléments pour les diviser en vecteurs de 3 chacun, alors mon résultat devrait avoir des vecteurs avec 3, 3,4 éléments respectivement. J'ai donc utilisé ce qui suit (j'ai laissé le code non optimisé pour la lisibilité, sinon pas besoin d'avoir beaucoup de variables):
la source
Voici une autre variante.
REMARQUE: avec cet exemple, vous spécifiez la TAILLE DU MORCEAU dans le deuxième paramètre
la source
Fonction simple pour diviser un vecteur en utilisant simplement des index - pas besoin de trop compliquer cela
la source
Si vous n'aimez pas
split()
et que vous n'aimez pasmatrix()
(avec ses NA pendantes), il y a ceci:Comme
split()
, il renvoie une liste, mais il ne perd pas de temps ou d'espace avec des étiquettes, il peut donc être plus performant.la source
Nous remercions @Sebastian pour cette fonction
la source
Si vous n'aimez pas
split()
et que cela ne vous dérange pas que les AN remplissent votre queue courte:Les colonnes de la matrice retournée ([, 1: ncol]) sont les droïdes que vous recherchez.
la source
J'ai besoin d'une fonction qui prend l'argument d'un data.table (entre guillemets) et un autre argument qui est la limite supérieure du nombre de lignes dans les sous-ensembles de ce data.table d'origine. Cette fonction produit le nombre de tableaux de données que cette limite supérieure autorise:
Cette fonction me donne une série de data.tables nommée df_ [numéro] avec la ligne de départ du data.table d'origine dans le nom. La dernière table data.table peut être courte et remplie de NA, vous devez donc la redéfinir sur les données restantes. Ce type de fonction est utile car certains logiciels SIG ont des limites sur le nombre de broches d'adresse que vous pouvez importer, par exemple. Par conséquent, le découpage de data.tables en morceaux plus petits peut ne pas être recommandé, mais il peut ne pas être évitable.
la source
Désolé si cette réponse arrive si tard, mais peut-être qu'elle peut être utile à quelqu'un d'autre. En fait, il existe une solution très utile à ce problème, expliquée à la fin de? Split.
la source
Encore une autre possibilité est la
splitIndices
fonction du packageparallel
:Donne:
la source
Wow, cette question a obtenu plus de traction que prévu.
Merci pour toutes les idees. J'ai trouvé cette solution:
La clé consiste à utiliser le paramètre seq (each = chunk.size) afin de le faire fonctionner. L'utilisation de seq_along agit comme rank (x) dans ma solution précédente, mais est en fait capable de produire le résultat correct avec des entrées en double.
la source
Cela se divise en morceaux de taille ⌊n / k⌋ + 1 ou ⌊n / k⌋ et n'utilise pas le tri O (n log n).
la source