Muszę podzielić wektor na n części o jednakowej wielkości w R. Nie mogłem znaleźć żadnej funkcji bazowej, aby to zrobić. Również Google nigdzie mnie nie doprowadził. Oto, co wymyśliłem, mam nadzieję, że pomoże komuś gdzieś.
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
Wszelkie komentarze, sugestie lub ulepszenia są bardzo mile widziane i doceniane.
Na zdrowie, Sebastian
x <- c(NA, 4, 3, NA, NA, 2, 1, 1, NA ); y <- letters[x]; z <- factor(y)
Podaje przykłady z brakującymi danymi, powtarzanymi wartościami, które nie są jeszcze posortowane i należą do różnych klas (liczba całkowita, znak, czynnik).Odpowiedzi:
Jednoliniowy podział d na kawałki o rozmiarze 20:
Więcej szczegółów: Myślę, że wszystko, co potrzebne jest
seq_along()
,split()
iceiling()
:źródło
n
kawałków o równej wielkości. To daje nieznaną liczbę kawałków wielkościn
. Miałem ten sam problem i korzystałem z rozwiązań z @mathheadinclouds.n-chunks
użyłemmax <- length(d)%/%n
. Użyłem tego z wektorem 31 ciągów i uzyskałem listę 3 wektorów po 10 zdań i jednego z 1 zdania.źródło
źródło
Wypróbuj funkcję ggplot2
cut_number
:źródło
x
,y
lubz
zdefiniowane w niniejszym komentarzu . W szczególności sortuje wyniki, które mogą, ale nie muszą być poprawne, w zależności od aplikacji.To podzieli to inaczej niż to, co masz, ale myślę, że nadal jest całkiem ładną strukturą listy:
Co da ci następujące, w zależności od tego, jak chcesz to sformatować:
Uruchamianie kilku taktów za pomocą tych ustawień:
Następnie mamy następujące wyniki:
EDYCJA: Zmiana z as.factor () na as.character () w mojej funkcji sprawiła, że stało się to dwa razy szybciej.
źródło
Jeszcze kilka wariantów stosu ...
Pamiętaj, że nie musisz
factor
tutaj używać tej funkcji, ale nadal chceszsort
włączyć1 2 3 10
/ wyłączyć swój pierwszy wektor :Lub możesz przypisać indeksy znaków, vice liczby w lewych paskach powyżej:
Lub możesz użyć prostych nazw przechowywanych w wektorze. Zauważ, że używając,
sort
aby uzyskać kolejne wartości wx
kolejności alfabetycznej, etykiety:źródło
Używając podstawy R
rep_len
:Jak już wspomniano, jeśli chcesz posortować indeksy, po prostu:
źródło
Możesz połączyć podział / cięcie, jak sugeruje mdsummer, z kwantylem, aby stworzyć parzyste grupy:
To daje taki sam wynik dla twojego przykładu, ale nie dla zmiennych skośnych.
źródło
split(x,matrix(1:n,n,length(x))[1:length(x)])
być może jest to bardziej jasne, ale ten sam pomysł:
split(x,rep(1:n, ceiling(length(x)/n),length.out = length(x)))
jeśli chcesz to zamówić, rzuć coś wokół
źródło
Potrzebowałem tej samej funkcji i zapoznałem się z poprzednimi rozwiązaniami, ale musiałem też mieć niezbilansowany fragment na końcu, tj. Jeśli mam 10 elementów do podzielenia ich na wektory po 3, to mój wynik powinien mieć wektory z 3, Odpowiednio 3,4 elementy. Więc użyłem następującego (zostawiłem kod niezoptymalizowany pod kątem czytelności, w przeciwnym razie nie trzeba mieć wielu zmiennych):
źródło
Oto inny wariant.
UWAGA: w tej próbce określasz ROZMIAR CZASU w drugim parametrze
źródło
Prosta funkcja dzielenia wektora za pomocą indeksów - nie trzeba tego nadmiernie komplikować
źródło
Jeśli nie lubisz
split()
i nie lubiszmatrix()
(z wiszącymi NA), jest to:Jak
split()
to zwraca listę, ale nie tracić czasu i przestrzeni z etykietami, więc może być bardziej wydajnych.źródło
Podziękowania dla @Sebastian za tę funkcję
źródło
Jeśli ci się nie podoba
split()
i nie masz nic przeciwko NA wystającym z krótkiego ogona:Kolumny zwróconej macierzy ([, 1: ncol]) to droidy, których szukasz.
źródło
Potrzebuję funkcji, która pobiera argument tabeli data.tab (w cudzysłowach) i inny argument, który stanowi górną granicę liczby wierszy w podzestawach oryginalnej tabeli data.tab. Ta funkcja generuje dowolną liczbę danych. Tabele, które pozwala na górny limit:
Ta funkcja daje mi serię tabel data.t o nazwie df_ [liczba] z początkowym wierszem z oryginalnej tabeli data.tame w nazwie. Ostatnia tabela data.tab może być krótka i wypełniona NA, więc musisz podgrupować to z powrotem do pozostałych danych. Ten typ funkcji jest przydatny, ponieważ niektóre programy GIS mają na przykład ograniczenia dotyczące liczby pinów adresów, które można zaimportować. Dlatego dzielenie tabel danych na mniejsze części może nie być zalecane, ale nie można tego uniknąć.
źródło
Przepraszam, jeśli ta odpowiedź przychodzi tak późno, ale może być przydatna dla kogoś innego. W rzeczywistości istnieje bardzo przydatne rozwiązanie tego problemu, wyjaśnione na końcu „podziału”.
źródło
Jeszcze inną możliwością jest
splitIndices
funkcja z pakietuparallel
:Daje:
źródło
Wow, to pytanie zyskało większą przyczepność niż się spodziewano.
Dzięki za wszystkie pomysły. Wymyśliłem to rozwiązanie:
Kluczem jest użycie parametru seq (each = chunk.size), aby działał. Używanie seq_along działa w moim poprzednim rozwiązaniu jak ranga (x), ale w rzeczywistości jest w stanie uzyskać poprawny wynik ze zduplikowanymi wpisami.
źródło
Dzieli się to na kawałki o wielkości ⌊n / k⌋ + 1 lub ⌊n / k⌋ i nie używa sortowania O (n log n).
źródło