Eu tenho que dividir um vetor em n pedaços de tamanho igual em R. Eu não consegui encontrar nenhuma função básica para fazer isso. Além disso, o Google não me levou a lugar algum. Então, aqui está o que eu criei, espero que ajude alguém em algum lugar.
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
Quaisquer comentários, sugestões ou melhorias são realmente bem-vindos e apreciados.
Cheers, Sebastian
x <- c(NA, 4, 3, NA, NA, 2, 1, 1, NA ); y <- letters[x]; z <- factor(y)
fornece exemplos com dados ausentes, valores repetidos, que ainda não foram classificados e estão em diferentes classes (número inteiro, caractere, fator).Respostas:
Uma linha que divide d em pedaços de tamanho 20:
Mais detalhes: Eu acho que tudo que você precisa é
seq_along()
,split()
eceiling()
:fonte
n
pedaços de tamanho igual. Isso gera um número desconhecido de pedaços de tamanhon
. Eu tive o mesmo problema e usei as soluções de @mathheadinclouds.n-chunks
eu costumavamax <- length(d)%/%n
. Eu usei isso com um vetor de 31 strings e obtive uma lista de 3 vetores de 10 frases e um de 1 frase.fonte
fonte
Experimente a função ggplot2
cut_number
:fonte
x
,y
ouz
definido no este comentário . Em particular, ele classifica os resultados, o que pode ou não ser bom, dependendo do aplicativo.Isso o dividirá de maneira diferente do que você tem, mas ainda é uma estrutura de lista bastante interessante:
O que fornecerá o seguinte, dependendo de como você deseja que ele seja formatado:
Executando algumas temporizações usando estas configurações:
Então temos os seguintes resultados:
EDIT: Alterar de as.factor () para as.character () na minha função tornou duas vezes mais rápido.
fonte
Mais algumas variantes para a pilha ...
Observe que você não precisa usar a
factor
função aqui, mas ainda deseja usar osort
seu primeiro vetor1 2 3 10
:Ou você pode atribuir índices de caracteres, vice os números nos carrapatos da esquerda acima:
Ou você pode usar nomes de palavras simples armazenados em um vetor. Observe que usar
sort
para obter valores consecutivos emx
ordem alfabética dos rótulos:fonte
Usando os R's básicos
rep_len
:E como já mencionado, se você deseja índices ordenados, basta:
fonte
Você pode combinar a divisão / corte, conforme sugerido pelo mdsummer, com o quantil para criar grupos pares:
Isso fornece o mesmo resultado para o seu exemplo, mas não para variáveis assimétricas.
fonte
split(x,matrix(1:n,n,length(x))[1:length(x)])
talvez isso seja mais claro, mas a mesma idéia:
split(x,rep(1:n, ceiling(length(x)/n),length.out = length(x)))
se você quiser, jogue uma espécie em torno dele
fonte
Eu precisava da mesma função e li as soluções anteriores, no entanto, também precisava que o pedaço desequilibrado estivesse no final, ou seja, se eu tiver 10 elementos para dividi-los em vetores de 3 cada, meu resultado deverá ter vetores com 3, 3,4 elementos, respectivamente. Então, usei o seguinte (deixei o código não otimizado para facilitar a leitura, caso contrário, não há necessidade de ter muitas variáveis):
fonte
Aqui está outra variante.
NOTA: com este exemplo, você está especificando CHUNK SIZE no segundo parâmetro
fonte
Função simples para dividir um vetor usando simplesmente índices - não é necessário complicar demais
fonte
Se você não gosta
split()
e não gostamatrix()
(com suas NAs pendentes), existe o seguinte:Como
split()
, ele retorna uma lista, mas não perde tempo ou espaço com rótulos, por isso pode ter mais desempenho.fonte
Crédito para @Sebastian por esta função
fonte
Se você não gosta
split()
e não se importa com as NAs acariciando sua cauda curta:As colunas da matriz retornada ([, 1: ncol]) são os dróides que você está procurando.
fonte
Eu preciso de uma função que aceite o argumento de uma data.table (entre aspas) e outro argumento que seja o limite superior do número de linhas nos subconjuntos dessa data.table original. Essa função produz qualquer número de tabelas de dados que o limite superior permita:
Essa função fornece uma série de tabelas de dados denominadas df_ [número] com a linha inicial da tabela de dados original no nome. A última tabela de dados pode ser curta e preenchida com NAs; portanto, você deve agrupá-las novamente para os dados restantes. Esse tipo de função é útil porque certos softwares GIS têm limites para quantos pinos de endereço você pode importar, por exemplo. Portanto, fatiar tabelas de dados em pedaços menores pode não ser recomendado, mas pode não ser evitável.
fonte
Desculpe se esta resposta chega tão tarde, mas talvez possa ser útil para outra pessoa. Na verdade, existe uma solução muito útil para esse problema, explicada no final da divisão.
fonte
Ainda outra possibilidade é a
splitIndices
função do pacoteparallel
:Dá:
fonte
Uau, essa pergunta teve mais tração do que o esperado.
Obrigado por todas as idéias. Eu vim com esta solução:
A chave é usar o parâmetro seq (each = chunk.size) para fazê-lo funcionar. O uso de seq_along atua como rank (x) na minha solução anterior, mas na verdade é capaz de produzir o resultado correto com entradas duplicadas.
fonte
Isso se divide em pedaços de tamanho ⌊n / k⌋ + 1 ou ⌊n / k⌋ e não usa a classificação O (n log n).
fonte