gpt4 book ai didi

R:计算字符串列表中的所有组合(特定顺序)

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

我正在尝试计算由“>”分隔的大量字符中的所有序列,但只计算彼此直接相邻的组合。

例如给定字符向量:

[1]Social>PaidSearch>PaidSearch>PaidSearch>PaidSearch>PaidSearch>PaidSearch>PaidSearch>PaidSearch>PaidSearch>PaidSearch>OrganicSearch>OrganicSearch>OrganicSearch
[2]Referral>Referral>Referral

我可以运行以下行来检索 2 个字符的所有组合:

split_fn <- sapply(p , strsplit , split = ">", perl=TRUE)

split_fn <- sapply(split_fn, function(x) paste(head(x,-1) , tail(x,-1) , sep = ">") )

返回:

[[1]]

[1] "Social>PaidSearch" "PaidSearch>PaidSearch" "PaidSearch>PaidSearch" "PaidSearch>PaidSearch" "PaidSearch>PaidSearch"
[6] "PaidSearch>PaidSearch" "PaidSearch>PaidSearch" "PaidSearch>PaidSearch" "PaidSearch>PaidSearch" "PaidSearch>PaidSearch"
[11] "PaidSearch>OrganicSearch" "OrganicSearch>OrganicSearch" "OrganicSearch>OrganicSearch"

[[2]]

[1] "Referral>Referral" "Referral>Referral"

这是我的数据中所有可能的 2 个字符序列(按顺序拆分)

我知道想要获得 3 个字符的所有可能结果。

例如

"Social>PaidSearch>PaidSearch" "PaidSearch>PaidSearch>PaidSearch"..."Referral>Referral>Referral"

尝试使用

unlist(lapply(strsplit(p, split = ">"), function(i) combn(sort(i), 3, paste, collapse='>')))

但它会返回所有组合,包括那些不直接跟随的组合。

我也不希望它返回第一行中的最后一个值与第二行中的第一个值等的组合。

最佳答案

让我们从创建一些数据开始:

set.seed(1)

data <- lapply(1:3, function(i) sample(LETTERS[1:3], rpois(1, 6), re = T))
data <- sapply(data, paste, collapse = ">")

data
#> [1] "B>B>C>A" "C>B>B>A>A>A>C>B>C" "C>C>B>C>C>A"

考虑到这个问题,将这些数据视为列表是有意义的用分隔符 > 分割元素后得到的向量:

strsplit(data, ">")
#> [[1]]
#> [1] "B" "B" "C" "A"
#>
#> [[2]]
#> [1] "C" "B" "B" "A" "A" "A" "C" "B" "C"
#>
#> [[3]]
#> [1] "C" "C" "B" "C" "C" "A"

现在,问题的核心是找到给定的所有连续序列来自单个向量的长度。一旦我们可以做到这一点,申请就很简单了我们拥有的数据列表;转换回分隔格式将也很简单。

有了这个目标,我们就可以创建一个函数来提取序列;在这里我们只是遍历每个元素并提取给定长度的所有序列到列表:

seqs <- function(x, length = 2) {
if (length(x) < length)
return(NULL)
k <- length - 1
lapply(seq_len(length(x) - k), function(i) x[i:(i + k)])
}

我们现在可以在之后将函数应用于数据将分隔的字符拆分为向量以获得结果。我们还需要一个额外的 sapplypaste 来将数据转换回我们开始使用的分隔格式:

lapply(strsplit(data, ">"), function(x) {
sapply(seqs(x, 3), paste, collapse = ">")
})
#> [[1]]
#> [1] "B>B>C" "B>C>A"
#>
#> [[2]]
#> [1] "C>B>B" "B>B>A" "B>A>A" "A>A>A" "A>A>C" "A>C>B" "C>B>C"
#>
#> [[3]]
#> [1] "C>C>B" "C>B>C" "B>C>C" "C>C>A"

进一步的,为了同时得到多个长度的序列,我们可以再增加一层迭代:

lapply(strsplit(data, ">"), function(x) {
unlist(sapply(c(2, 3), function(n) {
sapply(seqs(x, n), paste, collapse = ">")
}))
})
#> [[1]]
#> [1] "B>B" "B>C" "C>A" "B>B>C" "B>C>A"
#>
#> [[2]]
#> [1] "C>B" "B>B" "B>A" "A>A" "A>A" "A>C" "C>B" "B>C"
#> [9] "C>B>B" "B>B>A" "B>A>A" "A>A>A" "A>A>C" "A>C>B" "C>B>C"
#>
#> [[3]]
#> [1] "C>C" "C>B" "B>C" "C>C" "C>A" "C>C>B" "C>B>C" "B>C>C" "C>C>A"

reprex package 创建于 2018-05-21 (v0.2.0).

关于R:计算字符串列表中的所有组合(特定顺序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50442276/

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