Criei uma função que divide uma string por ":" e pega o primeiro elemento, que é a informação que preciso de um vcf:
remove_semicolon = function(x){
newstr = strsplit(x,":")[[1]][1]
return(newstr)
}
Desejo aplicá-lo a cada elemento de um quadro de dados, como o seguinte:
>rubbish
NS05 NS113 NS137
1 0/0:1 0/0:15 0/0:25
2 0/0:1 0/0:15 0/0:25
3 0/0:1 0/0:16 0/0:25
4 1/1:0,1:1:3:39,3,0 1/1:0,16:16:48:621,48,0 1/1:0,26:26:78:969,78,0
5 0/0:1 0/0:16 0/0:29
De modo que para rubbish[1,1] a saída desejada é "0/0", para rubbish[4,1] "1/1" etc, com a estrutura da matriz/quadro de dados deixada intacta. No entanto,
rubbish[]=lapply(rubbish,remove_semicolon)
retorna:
> rubbish
NS05 NS113 NS137
1 0/0 0/0 0/0
2 0/0 0/0 0/0
3 0/0 0/0 0/0
4 0/0 0/0 0/0
5 0/0 0/0 0/0
ainda que, em contraste,
sapply(rubbish[,1],remove_semicolon)
retorna o que eu quero, ou seja, um vetor 0/0, 0/0, 0/0, 1/1, 0/0 em vez de todos 0/0:
0/0:1 0/0:1 0/0:1 1/1:0,1:1:3:39,3,0
"0/0" "0/0" "0/0" "1/1"
0/0:1
"0/0"
O que estou fazendo incorretamente ao implementar lapply? Ele não deveria simplesmente aplicar a função remove_semicolon a cada elemento de lixo da mesma forma que sapply faz para cada elemento de um vetor de coluna?
Usar
apply(., MARGIN = 1:2, .)
parece funcionar:Se você olhar para a saída de
lapply(rubbish, remove_semicolon)
(antes de atribuí-la de volta ao quadro de dados), verá que cada elemento da saída é um vetor de comprimento 1 (que então é replicado para preencher a coluna). Isso acontece porqueremove_semicolon
não é vetorizado.Isso funcionaria com
lapply()
:Outra alternativa seria usar
gsub()
(oustringr::str_extract
) com uma expressão regular, por exemplo(é verdade que parece um pouco com mágica)
exemplo