Tengo un marco de datos con cadenas de caracteres en column1
e identificación en column2
. La cadena contiene A,T,G or C
. Me gustaría imprimir las líneas que tienen un A
en la posición 1. Entonces me gustaría imprimir las líneas que tienen A
en la posición 2 y así sucesivamente y guárdelos en archivos separados. Hasta ahora he usado biostrings en R para un análisis similar, pero no funcionará exactamente para este problema. Me gustaría usar perl.
Sequence ID
TATACAAGGGCAAGCTCTCTGT mmu-miR-381-3p
TCGGATCCGTCTGAGCT mmu-miR-127-3p
ATAGTAGACCGTATAGCGTACG mmu-miR-411-5p
......
600 more lines
Respuestas
1 para la respuesta № 1Las cadenas biológicas funcionarán perfectamente y serán bastante rápidas. Llamemos a tu cadena de ADN mydata
HasA <- sapply(mydata,function(x) as.character(x[2]) == "A")
Ahora tienes un vector de VERDADERO o FALSO que indica qué secuencia tiene una A en la posición 2. Puedes convertirlo en un marco de datos agradable como este
HasA.df <- data.frame("SeqName" = names(mydata), "A_at_2" = HasA)
1 para la respuesta № 2
No estoy seguro del resultado esperado,
mydata <- read.table(text="Sequence ID
TATACAAGGGCAAGCTCTCTGT mmu-miR-381-3p
TCGGATCCGTCTGAGCT mmu-miR-127-3p
ATAGTAGACCGTATAGCGTACG mmu-miR-411-5p",sep="",header=T,stringsAsFactors=F)
mCh <- max(nchar(mydata[,1])) #gives the maximum number of characters in the first column
sapply(seq(mCh), function(i) substr(mydata[,1],i,i)=="A") #gives the index
Puedes usar which
para obtener el índice de la fila que satisface la condición para cada posición
res <- stack(setNames(sapply(seq(mCh),
function(i) which(substr(mydata[,1],i,i)=="A")),1:mCh))[,2:1]
tail(res, 5) #for the 13th position, 1st and 3rd row of the sequence are TRUE
ind values
#11 13 1
#12 13 3
#13 14 2
#14 15 3
#15 20 3
usar el índice values
para extraer las filas. Para el 1er puesto
mydata[res$values[res$ind==1],]
# Sequence ID
# 3 ATAGTAGACCGTATAGCGTACG mmu-miR-411-5p
0 para la respuesta № 3
Usando un perl de una sola línea
perl -Mautodie -lane "
BEGIN {($f) = @ARGV}
next if $. == 1;
my @c = split //, $F[0];
for my $i (grep {$c[$_] eq "A"} (0..$#c)) {
open my $fh, ">>", "$f.$i";
print $fh $_;
}
" file