Saya harus membagi vektor menjadi n potongan dengan ukuran yang sama dalam R. Saya tidak dapat menemukan fungsi dasar untuk melakukan itu. Google juga tidak membantu saya. Jadi, inilah yang saya hasilkan, semoga membantu seseorang di suatu tempat.
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
Setiap komentar, saran atau perbaikan sangat disambut dan dihargai.
Salam, Sebastian
x <- c(NA, 4, 3, NA, NA, 2, 1, 1, NA ); y <- letters[x]; z <- factor(y)
memberikan contoh dengan data yang hilang, nilai berulang, yang belum diurutkan, dan berada di kelas yang berbeda (integer, karakter, faktor).Jawaban:
Pemisah satu lapis d menjadi potongan ukuran 20:
Lebih detail: Saya pikir yang Anda butuhkan hanyalah
seq_along()
,split()
danceiling()
:sumber
n
potongan dengan ukuran yang sama. Ini memberi Anda jumlah potongan yang tidak diketahuin
. Saya memiliki masalah yang sama dan menggunakan solusi dari @mathheadinclouds.n-chunks
saya gunakanmax <- length(d)%/%n
. Saya menggunakan ini dengan vektor 31 string dan memperoleh daftar 3 vektor dari 10 kalimat dan satu dari 1 kalimat.sumber
sumber
Cobalah fungsi ggplot2,
cut_number
:sumber
x
,y
atauz
didefinisikan dalam komentar ini . Secara khusus, ini mengurutkan hasil, yang mungkin atau mungkin tidak apa-apa, tergantung pada aplikasi.Ini akan membaginya secara berbeda dengan apa yang Anda miliki, tetapi saya pikir struktur daftar masih cukup bagus:
Yang akan memberi Anda yang berikut, tergantung pada bagaimana Anda ingin diformat:
Menjalankan beberapa pengaturan waktu menggunakan pengaturan ini:
Maka kami memiliki hasil sebagai berikut:
EDIT: Mengubah dari as.factor () ke as.character () dalam fungsi saya membuatnya dua kali lebih cepat.
sumber
Beberapa varian lagi untuk tumpukan ...
Catatan, bahwa Anda tidak perlu menggunakan
factor
fungsi di sini, tetapi Anda tetap inginsort
o / w vektor pertama Anda adalah1 2 3 10
:Atau Anda dapat menetapkan indeks karakter, dan sebaliknya angka dalam kutu kiri di atas:
Atau Anda dapat menggunakan nama kata biasa yang disimpan dalam vektor. Perhatikan bahwa menggunakan
sort
untuk mendapatkan nilai berurutan dalamx
mengabjadkan label:sumber
Menggunakan basis R
rep_len
:Dan seperti yang telah disebutkan jika Anda ingin indeks yang diurutkan, cukup:
sumber
Anda bisa menggabungkan split / cut, seperti yang disarankan oleh mdsummer, dengan quantile untuk membuat grup genap:
Ini memberikan hasil yang sama untuk contoh Anda, tetapi tidak untuk variabel miring.
sumber
split(x,matrix(1:n,n,length(x))[1:length(x)])
mungkin ini lebih jelas, tetapi gagasan yang sama:
split(x,rep(1:n, ceiling(length(x)/n),length.out = length(x)))
Jika Anda ingin memesannya, letakkan semacam itu di sekitarnya
sumber
Saya memerlukan fungsi yang sama dan telah membaca solusi sebelumnya, namun saya juga perlu memiliki potongan yang tidak seimbang pada akhirnya yaitu jika saya memiliki 10 elemen untuk membaginya menjadi vektor masing-masing 3, maka hasil saya harus memiliki vektor dengan 3, Masing-masing 3,4 elemen. Jadi saya menggunakan yang berikut (saya meninggalkan kode tidak dioptimalkan untuk dibaca, jika tidak, tidak perlu memiliki banyak variabel):
sumber
Berikut varian lainnya.
CATATAN: dengan sampel ini Anda menentukan UKURAN CHUNK pada parameter kedua
sumber
Fungsi sederhana untuk memisahkan vektor hanya dengan menggunakan indeks - tidak perlu terlalu rumit
sumber
Jika Anda tidak suka
split()
dan tidak sukamatrix()
(dengan NAS-nya yang menggantung), ini dia:Seperti
split()
, ia mengembalikan daftar, tetapi tidak membuang-buang waktu atau ruang dengan label, jadi itu mungkin lebih berkinerja.sumber
Kredit ke @Sebastian untuk fungsi ini
sumber
Jika Anda tidak suka
split()
dan Anda tidak keberatan NA melapisi ekor pendek Anda:Kolom dari matriks yang dikembalikan ([, 1: ncol]) adalah droid yang Anda cari.
sumber
Saya membutuhkan fungsi yang mengambil argumen dari data.table (dalam tanda kutip) dan argumen lain yang merupakan batas atas pada jumlah baris dalam subset dari data.table yang asli. Fungsi ini menghasilkan berapa pun jumlah data. Tabel yang batas atas memungkinkan untuk:
Fungsi ini memberi saya serangkaian data.tabel bernama df_ [angka] dengan baris awal dari data asli.tabel dalam nama. Tabel data terakhir bisa pendek dan diisi dengan NAS sehingga Anda harus mengelompokkannya kembali ke data apa pun yang tersisa. Jenis fungsi ini berguna karena perangkat lunak SIG tertentu memiliki batasan pada berapa banyak pin alamat yang dapat Anda impor, misalnya. Jadi mengiris data. Tabel menjadi potongan yang lebih kecil mungkin tidak disarankan, tetapi mungkin tidak dapat dihindari.
sumber
Maaf jika jawaban ini datang sangat terlambat, tapi mungkin ini bisa berguna untuk orang lain. Sebenarnya ada solusi yang sangat berguna untuk masalah ini, dijelaskan di akhir split.
sumber
Namun kemungkinan lain adalah
splitIndices
fungsi dari paketparallel
:Memberi:
sumber
Wow, pertanyaan ini mendapat daya tarik lebih dari yang diharapkan.
Terima kasih untuk semua idenya. Saya telah menemukan solusi ini:
Kuncinya adalah menggunakan parameter seq (setiap = chunk.size) sehingga membuatnya berfungsi. Menggunakan seq_along bertindak seperti peringkat (x) dalam solusi saya sebelumnya, tetapi sebenarnya mampu menghasilkan hasil yang benar dengan entri duplikat.
sumber
Ini terbagi menjadi potongan-potongan ukuran ⌊n / k⌋ + 1 atau ⌊n / k⌋ dan tidak menggunakan jenis O (n log n).
sumber