Я должен разделить вектор на n кусков одинакового размера в R. Я не смог найти ни одной базовой функции для этого. Кроме того, Google не получил меня никуда. Так вот, что я придумал, надеюсь, это поможет кому-то где-то.
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
Любые комментарии, предложения или улучшения действительно приветствуются и приветствуются.
Ура, Себастьян
x <- c(NA, 4, 3, NA, NA, 2, 1, 1, NA ); y <- letters[x]; z <- factor(y)
приводятся примеры с отсутствующими данными, повторяющимися значениями, которые еще не отсортированы и относятся к разным классам (целое число, символ, фактор).Ответы:
Однострочник разделяется на куски размером 20:
Более подробная информация: я думаю, что все, что вам нужно
seq_along()
,split()
иceiling()
:источник
n
куски одинакового размера. Это дает вам неизвестное количество кусков размераn
. У меня была та же проблема, и я использовал решения @mathheadinclouds.n-chunks
я использовалmax <- length(d)%/%n
. Я использовал это с вектором из 31 строки и получил список из 3 векторов из 10 предложений и одного из 1 предложения.источник
источник
Попробуйте функцию ggplot2
cut_number
:источник
x
,y
илиz
определено в этом комментарии . В частности, он сортирует результаты, которые могут быть или не быть в порядке, в зависимости от приложения.Это разделит его по-другому на то, что у вас есть, но я думаю, что все еще довольно хорошая структура списка:
Что даст вам следующее, в зависимости от того, как вы хотите отформатировать:
Выполнение нескольких таймингов с использованием этих настроек:
Тогда мы получаем следующие результаты:
РЕДАКТИРОВАТЬ: переход от as.factor () к as.character () в моей функции сделал это в два раза быстрее.
источник
Еще несколько вариантов в кучу ...
Обратите внимание, что вам не нужно использовать
factor
функцию здесь, но вы все еще хотите, чтобыsort
ваш первый вектор был1 2 3 10
:Или вы можете назначить индексы символов, используя цифры в левом поле:
Или вы можете использовать простые имена, хранящиеся в векторе. Обратите внимание, что использование
sort
для получения последовательных значений вx
алфавитном порядке надписей:источник
Используя базу R
rep_len
:И, как уже упоминалось, если вы хотите отсортированные индексы, просто:
источник
Вы можете объединить split / cut, как предлагает mdsummer, с квантилем для создания четных групп:
Это дает тот же результат для вашего примера, но не для перекошенных переменных.
источник
split(x,matrix(1:n,n,length(x))[1:length(x)])
возможно это более понятно, но идея та же
split(x,rep(1:n, ceiling(length(x)/n),length.out = length(x)))
если вы хотите, чтобы он был заказан, разбросайте его
источник
Мне нужна была та же функция, и я прочитал предыдущие решения, однако мне также нужно было иметь несбалансированный кусок, чтобы быть в конце, то есть, если у меня есть 10 элементов, чтобы разбить их на векторы по 3, то мой результат должен иметь векторы с 3, 3,4 элемента соответственно. Поэтому я использовал следующее (я оставил код неоптимизированным для удобства чтения, иначе не нужно иметь много переменных):
источник
Вот еще один вариант.
ПРИМЕЧАНИЕ: в этом примере вы указываете CHUNK SIZE во втором параметре
источник
Простая функция для разделения вектора путем простого использования индексов - не нужно слишком усложнять это
источник
Если вам не нравится
split()
и вам не нравитсяmatrix()
(с его висящими АН), вот что:Например
split()
, он возвращает список, но не тратит время и пространство на метки, поэтому он может быть более производительным.источник
Благодарим @Sebastian за эту функцию
источник
Если вам не нравится,
split()
и вы не возражаете против того, чтобы АН подметали ваш короткий хвост:Столбцы возвращаемой матрицы ([, 1: ncol]) - это те дроиды, которых вы ищете.
источник
Мне нужна функция, которая принимает аргумент data.table (в кавычках) и другой аргумент, который является верхним пределом количества строк в подмножествах этого исходного data.table. Эта функция генерирует любое количество data.tables, которое позволяет верхний предел:
Эта функция дает мне ряд data.tables с именем df_ [число] с начальной строкой из исходного data.table в имени. Последний файл data.table может быть коротким и заполненным NA, поэтому вам нужно вернуть его обратно к любым оставшимся данным. Этот тип функций полезен, потому что определенное программное обеспечение ГИС имеет ограничения, например, на количество выводов адреса, которые вы можете импортировать. Поэтому разделение data.tables на более мелкие куски не рекомендуется, но этого нельзя избежать.
источник
Извините, если этот ответ приходит так поздно, но, возможно, он может быть полезен для кого-то еще. На самом деле есть очень полезное решение этой проблемы, объясненное в конце? Split.
источник
Еще одна возможность -
splitIndices
функция из пакетаparallel
:дает:
источник
Вау, этот вопрос получил больше тяги, чем ожидалось.
Спасибо за все идеи. Я пришел с этим решением:
Ключ должен использовать параметр seq (each = chunk.size), чтобы он работал. Использование seq_along действует как rank (x) в моем предыдущем решении, но на самом деле может дать правильный результат с дублирующимися записями.
источник
Это разбивает на куски размером ⌊n / k⌋ + 1 или ⌊n / k⌋ и не использует сортировку O (n log n).
источник