gpt4 book ai didi

R:受限排列比使用 for 循环更有效

转载 作者:行者123 更新时间:2023-12-02 06:26:53 25 4
gpt4 key购买 nike

我正在尝试置换一个可变长度的字符向量a,每次选择 3 个元素,不重复。排序只计算第一个元素,但不计算第二个和第三个元素(例如 abc != bac != cab,但 abc = acb 和 bca = bac)。每组 3 个排列元素应该是数据帧 b 中的一行。

一个包含字母 a,b,c,d,e 会产生预期的输出:

abc
abd
abe
acd
ace
ade

bac
bad
bae
bcd
bce
bde

cab
cad
cae
cbd
cbe
cde

dab
dac
dae
dbc
dbe
dce

eab
eac
ead
ebc
ebd
ecd

使用 3 个 for 循环我想我能够实现这个输出,但是如果向量很长它会很慢。

a = letters[1:5]
aL = length(a)
b <- data.frame(var1 = character(),
var2 = character(),
var3 = character(),
stringsAsFactors = FALSE)


# restricted permutations for moderation
pracma::tic()
for(i in 1:aL){
for(j in 1:(aL-1)){
for(k in (j+1):aL){
if(j != i & k != i) {
b <- rbind(b, data.frame(a[i], a[j], a[k])) }
}
}
}
pracma::toc()
#> elapsed time is 0.070000 seconds
b
#> a.i. a.j. a.k.
#> 1 a b c
#> 2 a b d
#> 3 a b e
#> 4 a c d
#> 5 a c e
#> 6 a d e
#> 7 b a c
#> 8 b a d
#> 9 b a e
#> 10 b c d
#> 11 b c e
#> 12 b d e
#> 13 c a b
#> 14 c a d
#> 15 c a e
#> 16 c b d
#> 17 c b e
#> 18 c d e
#> 19 d a b
#> 20 d a c
#> 21 d a e
#> 22 d b c
#> 23 d b e
#> 24 d c e
#> 25 e a b
#> 26 e a c
#> 27 e a d
#> 28 e b c
#> 29 e b d
#> 30 e c d

reprex package 创建于 2019-07-17 (v0.2.1)

我怎样才能在更短的时间内达到相同的结果。递归更快吗?

非常感谢任何帮助。谢谢。

最佳答案

我提出以下解决方案:

a = letters[1:5]
A = t(combn(a,3)) # create all possible three-letter combinations,
# disregarding the order
Full = rbind(A, A[,3:1], A[,c(2,3,1)]) # put every of the elements of the
# differing combinations in first place once

关于R:受限排列比使用 for 循环更有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57074976/

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