gpt4 book ai didi

r - 在R中的数字序列中查找具有特定长度的所有子序列

转载 作者:行者123 更新时间:2023-12-04 11:18:09 25 4
gpt4 key购买 nike

我想在(最小)长度为 n 的序列中找到所有子序列。让我们假设我有这个序列

sequence <- c(1,2,3,2,5,3,2,6,7,9)

我想找到最小长度为 3 的递增子序列。输出应该是一个数据帧,每个子序列的起始和结束位置都被找到。

df =data.frame(c(1,7),c(3,10))
colnames(df) <- c("start", "end")

有人可以提示如何解决我的问题吗?

提前致谢!

最佳答案

仅使用基础 R 的一种方法

n <- 3

do.call(rbind, sapply(split(1:length(sequence), cumsum(c(0, diff(sequence)) < 1)),
function(x) if (length(x) >= n) c(start = x[1], end = x[length(x)])))

# start end
#1 1 3
#4 7 10
split sequence的索引基于连续递增的子序列,如果 length每组的大于等于 n返回该组的开始和结束索引。

要理解让我们分解并逐步理解它

使用 diff我们可以找到连续元素之间的差异
diff(sequence)
#[1] 0 1 1 -1 3 -2 -1 4 1 2

我们检查哪些没有递增的子序列
diff(sequence) < 1
#[1] FALSE FALSE TRUE FALSE TRUE TRUE FALSE FALSE FALSE

并对它们进行累计总和以创建组
cumsum(c(0, diff(sequence)) < 1)
#[1] 1 1 1 2 2 3 4 4 4 4

基于这个群体,我们 split索引来自 1:length(sequence)
split(1:length(sequence), cumsum(c(0, diff(sequence)) < 1))
#$`1`
#[1] 1 2 3

#$`2`
#[1] 4 5

#$`3`
#[1] 6

#$`4`
#[1] 7 8 9 10

使用 sapply我们遍历这个列表并返回列表的开始和结束索引 if length列表中的是 >= n (在这种情况下为 3)
sapply(split(1:length(sequence), cumsum(c(0, diff(sequence)) < 1)), 
function(x) if (length(x) >= n) c(start = x[1], end = x[length(x)]))

#$`1`
#start end
# 1 3

#$`2`
# NULL

#$`3`
#NULL

#$`4`
#start end
# 7 10

最后, rbind所有这些都一起使用 do.call . NULL元素被自动忽略。
do.call(rbind, sapply(split(1:length(sequence), cumsum(c(0, diff(sequence)) < 1)), 
function(x) if (length(x) >= n) c(start = x[1], end = x[length(x)])))

# start end
#1 1 3
#4 7 10

关于r - 在R中的数字序列中查找具有特定长度的所有子序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55515798/

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