Bagaimana saya bisa mengurutkan karakter setiap string secara efisien dalam vektor? Misalnya, diberi vektor string:
set.seed(1)
strings <- c(do.call(paste0, replicate(4, sample(LETTERS, 10000, TRUE), FALSE)),
do.call(paste0, replicate(3, sample(LETTERS, 10000, TRUE), FALSE)),
do.call(paste0, replicate(2, sample(LETTERS, 10000, TRUE), FALSE)))
Saya telah menulis fungsi yang akan membagi setiap string menjadi vektor, mengurutkan vektor, dan kemudian menciutkan hasilnya:
sort_cat <- function(strings){
tmp <- strsplit(strings, split="")
tmp <- lapply(tmp, sort)
tmp <- lapply(tmp, paste0, collapse = "")
tmp <- unlist(tmp)
return(tmp)
}
sorted_strings <- sort_cat(strings)
Namun, vektor string yang saya perlu terapkan ini sangat panjang, dan fungsi ini terlalu lambat. Adakah yang punya saran untuk meningkatkan kinerja?
r
string
performance
sorting
Powege
sumber
sumber
letters
tidak selalu panjang tiga seperti dalam contoh Anda, apakah mereka?fixed = TRUE
dalamstrsplit()
dapat meningkatkan kinerja karena tidak akan melibatkan penggunaan regex.Jawaban:
Anda dapat mengurangi waktu dengan meminimalkan jumlah loop pasti, dan selanjutnya melakukannya dengan menggunakan
parallel
paket ... pendekatan saya akan membagi string sekali, kemudian di pengurutan lingkaran dan tempel:Bercukur seperti 4 detik, tapi masih tidak secepat itu ...
Edit
Oke turun menggunakan
apply
.. strategi di sini:1) mengekstrak surat daripada membagi batas 2) membuat matriks dengan hasil 3) beralih melalui baris-bijaksana 4) Urutkan 5) Bergabunglah
Anda menghindari beberapa loop dan tidak mencantumkan .... IGNORE:?
Peringatan adalah jika string memiliki panjang yang berbeda, Anda harus menghapus semua kosong atau NA dalamapply
sepertii[!is.na(i) && nchar(i) > 0]
Membawa kami dari 10,3 detik menjadi 3,98
sumber
tmp <- strsplit(strings, split="") unlist(mclapply(tmp, function(i){ paste0(sort(i), collapse = "") }))
stringi
adalah paket favorit saya sejauh ini ...Mengimplementasikan kembali menggunakan
stringi
memberi sekitar 4x speedup. Saya juga mengeditsort_cat
untuk digunakanfixed = TRUE
dalamstrsplit
, yang membuatnya sedikit lebih cepat. Dan terima kasih kepada Carl untuk saran satu putaran, yang mempercepat kita sedikit lebih banyak.Metode ini juga bisa digunakan secara paralel. Membuat profil kode untuk melihat operasi mana yang benar-benar memakan waktu paling lama akan menjadi langkah selanjutnya yang baik jika Anda ingin lebih cepat lagi.
sumber
Versi ini sedikit lebih cepat
Tapi saya pikir itu mungkin dioptimalkan
sumber