gpt4 book ai didi

r - 在给定排列中查找断点

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

我正在为生物信息学作业进行文本处理,其中我们必须通过增加 (+) 或减少 (-) 来分隔数字序列。

断点 是序列从 + 切换到 - 或从 + 切换到 - 的地方。但是,序列中的所有数字都必须按顺序排列。一个序列可能由一个数字组成。

换句话说,增加的 strip 看起来像:

vector<-c("+1 +2 +3 +4 +5")  
vector<-c("+333 +334")

但不是:

vector<-c("+1 +3 +4")
vector<-c("+333 +332")

相同的逻辑适用于递减 strip 。

vector->c("-10 -9 -8")    NOT vector->("-10 -8 -7")

对于以下示例,有 8 个断点:

vector<-c("+3 +4 +5 -12 -8 -7 -6 +1 +2 +10 +9 -11 +13 +14")

#break1: +3 +4 +5
#break2: -12
#break3: -8 -7 -6
#break4: +1 +2
#break5: +10
#break6: +9
#break7: -11
#break8: +13 +14

有没有办法在 R 中对此进行编码?我之前尝试使用:

vector<-c(3,4,5,12,8,7,6,1,2,10,9,11,13,14)
Strip<- vector[-1] - head(vector, -1)
table(Strip)


#-5 -4 -1 1 2 7 8
#1 1 3 4 2 1 1

根据结果表,我只有 7 个断点(底行 3+4=7) 如果没有 +/- 字符,我只能让这段代码查看向量。出于这个原因,此代码不将 +10 和 +9 视为单独的断点,因为它们的顺序未被考虑在内。只有他们的距离 (1) 是。

最佳答案

因为优点和缺点似乎都适用于正整数流,所以我会试试这个:

vec <- "+3 +4 +5 -12 -8 -7 -6 +1 +2 +10 +9 -11 +13 +14"

首先,我们可以用空格将其拆分成单独的字符串:

(splvec <- strsplit(vec, "\\s+")[[1]])
# [1] "+3" "+4" "+5" "-12" "-8" "-7" "-6" "+1" "+2" "+10" "+9" "-11"
# [13] "+13" "+14"

(这可以扩展为硬编码[[1]],我现在将其作为练习。)这很好,但是我们想要/需要整数,以便于比较:

(splvec <- as.integer(strsplit(vec, "\\s+")[[1]]))
# [1] 3 4 5 -12 -8 -7 -6 1 2 10 9 -11 13 14

现在,我们需要根据它们从“递增 1”和其他任何变化的时间对它们进行分组:

cumsum(c(TRUE, diff(splvec) != 1))
# [1] 1 1 1 2 3 3 3 4 4 5 6 7 8 8

这提供了简单的分组信息,我们将把这些信息提供给 split(按组创建一个 list):

str( split(splvec, cumsum(c(TRUE, diff(splvec) != 1))) )
# List of 8
# $ 1: int [1:3] 3 4 5
# $ 2: int -12
# $ 3: int [1:3] -8 -7 -6
# $ 4: int [1:2] 1 2
# $ 5: int 10
# $ 6: int 9
# $ 7: int -11
# $ 8: int [1:2] 13 14

如果你绝对必须像以前一样格式化它(每次运行 pos/neg ints 一个字符串),那么:

str( lapply(split(splvec, cumsum(c(TRUE, diff(splvec) != 1))),
function(a) paste(sprintf('%+d', a), collapse = ' ')) )
# List of 8
# $ 1: chr "+3 +4 +5"
# $ 2: chr "-12"
# $ 3: chr "-8 -7 -6"
# $ 4: chr "+1 +2"
# $ 5: chr "+10"
# $ 6: chr "+9"
# $ 7: chr "-11"
# $ 8: chr "+13 +14"

(为了演示,我把事情一步步搞定了,很容易精简。)

关于r - 在给定排列中查找断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49595735/

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