Tenho uma referência e sequências de consulta:
ref_seq <- "ATTT"
df <- data.frame(V1=c("AATT", "TTTT", "GGTT"))
Gostaria de retornar as posições incompatíveis na sequência para cada consulta em comparação com a referência:
seqdiff <- function(seq1, seq2) {
seq <- strsplit(c(seq1, seq2), split= '')
mismatches <- which(seq[[1]] != seq[[2]])
return(mismatches)
}
apply(X=df, MARGIN=2, function(x) seqdiff(x, ref_seq))
# V1
# [1,] 1
# [2,] 2
Resultado esperado:
# V1
# [1,] 2
# [2,] 1
# [3,] 1 2
Considerando que essas são provavelmente sequências de nucleotídeos, você pode considerar a
adist
função. Ela pode ser usada em outros casos para determinar o número mínimo ponderado de inserções, deleções e substituições necessárias para transformar uma sequência em outra. Isso permite que as contagens sejam computadas na transformação, bem como a sequência de transformação no atributo "trafos" (M = correspondência, I = inserção, D = deleção, S = substituição).1) Isso produz um quadro de dados cuja
mismatch
coluna n é uma lista de vetores.2) Este é o mesmo, exceto que a
mismatch
coluna é um vetor de caracteres.3) Isso desaninha (1) fornecendo um quadro de dados de formato longo onde a saída para cada linha de entrada pode abranger várias linhas de saída.
(continua após a imagem)
4) Para utilizar
apply
a função deve-se utilizarlist
outoString
Uma abordagem usando
substr
Se você quiser apenas corresponder a posições específicas, use espaços em ref_seq , por exemplo
Obtendo o resultado em um formato de quadro de dados
Se
nchar
deref_seq
e todos os elementos deV1
tiverem o mesmo comprimento, podemos tentarvapply()
,utf8ToInt()
comwhich()
.A coerção de
i
paraV2
pode ser melhorada; ainda não tenho uma ideia melhor.Observação
Você pode usar
!=
inmapply
e parseTRUE
positionstoString
.Nota: Evite operações linha a linha em
data.frame
s, que são extremamente ineficientes. Lembre-se de que adata.frame
é, na verdade, uma lista de vetores com posições adjacentes aparecendo como linhas — e considere usarmapply()
orMap()
.apply()
Foi projetado para matrizes (como aplicado nesta solução) e deve ser usado apenas raramente (ou nunca) emdata.frame
s.