Tenho uma dúvida sobre como alterar os valores dos caracteres em um data.frame de acordo com combinações baseadas em duas colunas. Vou tentar dar um exemplo de como fica o data.frame
data <- data.frame(A1 = c("A", "T", "C"), A2 = c("C", "G", "T"),
Ind1 = c("AA", "TG", "TT"), Ind2 = c("CA", "GT", "CT"),
Ind3 = c("AC", "GG", "TC"))
> data
A1 A2 Ind1 Ind2 Ind3
1 A C AA CA AC
2 T G TG GT GG
3 C T TT CT TC
Quero alterar os valores nas colunas de Ind1 para Ind3 que não correspondem às combinações possíveis das colunas A1
e A2
, por exemplo, na primeira linha, A1
é um A
e A2
é um, C
então as combinações possíveis seriam AA
, AC
, CC
(combinação baseada em A1
, e A2
naquela ordem). Portanto, o Ind2 deveria ser AC
em vez de CA
.
A saída desejada seria esta:
> data
A1 A2 Ind1 Ind2 Ind3
1 A C AA AC AC
2 T G TG TG GG
3 C T TT CT CT
Eu tentei com switch
mas não funciona. Qualquer ajuda seria apreciada. Obrigado
Se entendi a pergunta corretamente e supondo que você tenha apenas duas cartas para lidar, há apenas um caso que precisará ser editado; é quando as letras estão na ordem inversa, ou seja, 'A2A1'. Todos os outros casos estarão corretos. Então você poderia gerenciar isso com uma simples
ifelse
mutação.Em resposta aos comentários do OP, usando dados "reais":
Além do truque muito inteligente de Peter, se você quiser uma solução um pouco mais codificada na base R, você pode usar
split
as strings linha por linha,sort
de acordo com a ordem em A1 e A2, epaste
vice-versa. Isso é independente do número de letras a serem solicitadas:Poderíamos usar um padrão regex para testar a validade do combo e depois reverter a string se ela não for válida: