我有一个字符矢量说A,G,C,T.我想要使​​用R的向量中最长的A序列

mad*_*guy 2 r vector longest-substring

set.seed (12345)

data <- paste(sample(c("A","C","G","T"),100000,replace=TRUE,prob=rep(0.25,4)))
data <- ifelse(data=="A",1,0)
Run Code Online (Sandbox Code Playgroud)

假设我将数据转换为1(所需字符)和0(否则).然后在每个位置取得总和.如果总结到一个位置匹配到下一个的总和,我们停止; 否则我们进行总和并将金额存储在这些位置.然后,相应位置的最大总和将给出序列的最大长度.

我得到了算法但无法编码.请帮忙.

Kon*_*lph 5

这个rle功能就是你想要的:

set.seed(12345)
data = sample(c('A', 'C', 'G', 'T'), 100000, replace = TRUE, prob = rep(0.25, 4))

run_lengths = rle(data == 'A')
(result = max(run_lengths$lengths[run_lengths$values]))
# [1] 10
Run Code Online (Sandbox Code Playgroud)

获取位置最长的运行是有点困难.您可以使用which.max它,但我们之前已经过滤掉了所有非A结果.相反,我们也可以将所有非A运行设置为0 - 这样,它们仍将存在,但不会是最大值:

only_a = ifelse(run_lengths$values, run_lengths$lengths, 0)
longest_run_index = which.max(only_a)
Run Code Online (Sandbox Code Playgroud)

现在我们需要从longest_run_index里面计算回到索引A.我们通过在此索引之前添加所有运行的长度来完成此操作:

index = sum(run_lengths$lengths[seq_len(longest_run_index - 1)]) + 1
data[index : (index + result - 1)]
# [1] "A" "A" "A" "A" "A" "A" "A" "A" "A" "A"
Run Code Online (Sandbox Code Playgroud)