gpt4 book ai didi

r - 如何有效地排序R中字符串中的字符?

转载 作者:行者123 更新时间:2023-12-04 04:01:50 26 4
gpt4 key购买 nike

如何有效地对向量中每个字符串的字符进行排序?例如,给定一个向量字符串:

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)))

我编写了一个函数,该函数将每个字符串拆分为一个向量,对向量进行排序,然后折叠输出:
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)

但是,我需要将其应用到的字符串向量很长,并且此功能太慢。有没有人对如何提高性能有任何建议?

最佳答案

您可以通过确保最大程度地减少循环次数来减少时间,并通过使用parallel包进一步这样做...我的方法是将字符串分割一次,然后在循环中进行排序和粘贴:

sort_cat <- function(strings){
tmp <- strsplit(strings, split="")
tmp <- lapply(tmp, sort)
tmp <- lapply(tmp, paste0, collapse = "")
tmp <- unlist(tmp)
return(tmp)
}

sort_cat2 <- function(strings){
unlist(mcMap(function(i){
stri_join(sort(i), collapse = "")
}, stri_split_regex(strings, "|", omit_empty = TRUE, simplify = F), mc.cores = 8L))
}

> microbenchmark::microbenchmark(
+ old = sort_cat(strings[1:500000]),
+ new = sort_cat2(strings[1:500000]),
+ times = 1
+ )
Unit: seconds
expr min lq mean median uq max neval
old 9.62673395 9.62673395 9.62673395 9.62673395 9.62673395 9.62673395 1
new 5.10547437 5.10547437 5.10547437 5.10547437 5.10547437 5.10547437 1

刮 mustache 需要4秒钟,但是还不算快...

编辑

好的,可以在这里使用 apply ..策略降低它:

1)提取字母而不是分割边界
2)用结果创建一个矩阵
3)逐行迭代
4)排序
5)加入

您避免了多个循环和取消列表操作。...忽略:?caveat是如果字符串长度不同,则需要删除 apply中的任何空或NA,例如 i[!is.na(i) && nchar(i) > 0]
sort_cat3 <- function(strings){
apply(stri_extract_all_regex(strings, "\\p{L}", simplify = TRUE), 1, function(i){
stri_join(stri_sort(i), collapse = "")
})
}

> microbenchmark::microbenchmark(
+ old = sort_cat(strings[1:500000]),
+ mapping = sort_cat2(strings[1:500000]),
+ applying = sort_cat3(strings[1:500000]),
+ times = 1
+ )
Unit: seconds
expr min lq mean median uq max neval
old 10.35101934 10.35101934 10.35101934 10.35101934 10.35101934 10.35101934 1
mapping 5.12771799 5.12771799 5.12771799 5.12771799 5.12771799 5.12771799 1
applying 3.97775326 3.97775326 3.97775326 3.97775326 3.97775326 3.97775326 1

将我们从10.3秒变为3.98

关于r - 如何有效地排序R中字符串中的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58287871/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com