gpt4 book ai didi

返回项目 R 的唯一组合?

转载 作者:行者123 更新时间:2023-12-02 01:31:11 25 4
gpt4 key购买 nike

给定多个向量,我想返回向量中列的唯一组合。这是一个可行的示例,但计算速度不如我想要的那么快:

library(dplyr)

c_sort_collapse <- function(...){
c(...) %>%
sort() %>%
paste(collapse = ".")
}

unique_set <- function(...){
list(...) %>%
purrr::pmap_chr(c_sort_collapse) %>%
unique()
}

unique_set(c("a", "b", "a"), c("a", "a", "b"))
#> [1] "a.a" "a.b"

有没有一种方法可以更快/更好地矢量化,即不依赖于循环每个项目(就像在 purrr::pmap_chr() 步骤中发生的情况)?

最佳答案

此解决方案仅在需要组合两个向量时才有效,但速度相当快。我冒昧地为其他方法提供了 stringi::stri_sort() 的优势,它已经快了一个数量级。

library(dplyr)
library(stringi)

set.seed(123)
x <- sample(letters, 1000, replace = TRUE)

set.seed(12)
y <- sample(letters, 1000, replace = TRUE)

c_sort_collapse <- function(...){
c(...) |>
stri_sort() |>
paste(collapse = ".")
}

unique_set <- function(...){
list(...) |>
purrr::pmap_chr(c_sort_collapse) |>
unique()
}

unique_set_matrix <- function(...){
matrix(c(...), nrow = length(list(...)), byrow = TRUE) |>
apply(2, stri_sort) |>
asplit(2) |>
unique() |>
sapply(paste, collapse = ".")
}

pminmax <- function(x, y) {
paste(pmin.int(x, y), pmax.int(x, y), sep = ".") |> unique()
}

all.equal(sort(unique_set(x, y)), sort(pminmax(x, y)))
#> [1] TRUE

bench::mark(
tidy = unique_set(x, y),
matrix = unique_set_matrix(x, y),
Map = Map(\(x,y) paste0(stri_sort(c(x,y)) , collapse = ".") , x , y) |>
unique() |> unlist(FALSE, FALSE),
pminmax = pminmax(x, y),
iterations = 20, check = FALSE
)
#> # A tibble: 4 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
#> 1 tidy 6.13ms 6.24ms 160. 45.4KB 17.8
#> 2 matrix 5.18ms 5.55ms 168. 229.8KB 29.7
#> 3 Map 5.7ms 6.83ms 151. 33.4KB 16.7
#> 4 pminmax 484.6µs 487.85µs 2035. 49.6KB 0

reprex package 于 2022 年 8 月 5 日创建(v2.0.1)

关于返回项目 R 的唯一组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73243043/

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