Ecco un modo potenziale. Scegli le file con gene e CDS. Quindi, si raggruppano i dati per Inizio e Fine. Potrebbero esserci gruppi di START/END con 1 o 3+ righe. Quindi, assicurati di scegliere i gruppi START/END con due righe. Inoltre, vuoi assicurarti di avere sia gene che CDS (length(unique(Tipo)) == 2
). Infine, si prende non NA elemento Accesion1 e Accesion 2.
filter(df, Tipo %in% c("gene", "CDS")) %>%
group_by(Start, End) %>%
filter(n() == 2 & length(unique(Tipo)) == 2) %>%
summarise(Accesion1 = Accesion1[!is.na(Accesion1)],
Accesion2 = Accesion2[!is.na(Accesion2)])
Ecco un esempio di pseudo.
mydf <- structure(list(Tipo = structure(c(2L, 1L, 2L, 1L, 2L, 2L), .Label = c("CDS",
"gene"), class = "factor"), Start = c(197, 197, 1717, 1717, 2864,
2864), End = c(1558, 1558, 2853, 2853, 3112, 3112), Strand = structure(c(1L,
1L, 1L, 1L, 1L, 1L), .Label = "+", class = "factor"), Accesion1 = structure(c(NA,
1L, NA, 2L, NA, 3L), .Label = c("NP_344554", "NP_344555", "NP_344556"
), class = "factor"), Accesion2 = structure(c(1L, NA, 2L, NA,
3L, NA), .Label = c("SP_0001", "SP_0002", "SP_0003"), class = "factor")), .Names = c("Tipo",
"Start", "End", "Strand", "Accesion1", "Accesion2"), row.names = c(NA,
-6L), class = "data.frame")
Tipo Start End Strand Accesion1 Accesion2
1 gene 197 1558 + <NA> SP_0001
2 CDS 197 1558 + NP_344554 <NA>
3 gene 1717 2853 + <NA> SP_0002
4 CDS 1717 2853 + NP_344555 <NA>
5 gene 2864 3112 + <NA> SP_0003
6 gene 2864 3112 + NP_344556 <NA>
filter(mydf, Tipo %in% c("gene", "CDS")) %>%
group_by(Start, End) %>%
filter(n() == 2 & length(unique(Tipo)) == 2) %>%
summarise(Accesion1 = Accesion1[!is.na(Accesion1)],
Accesion2 = Accesion2[!is.na(Accesion2)])
# Start End Accesion1 Accesion2
#1 197 1558 NP_344554 SP_0001
#2 1717 2853 NP_344555 SP_0002
Potrebbe essere necessario fornire un po 'più particolari, sul fatto che 'gene/CDS' verifica in coppie o no. Non è chiaro perché hai menzionato che ci sono altri valori 'tRNA, region, exon' ecc Supponiamo, se' df1 $ Start [6] <- 2964' quale sarebbe il risultato atteso per il set di dati di esempio – akrun
Sì, vengono in coppia La soluzione che hai dato sembra funzionare molto bene. Dato che alcuni tipi extra sono presenti, alcuni NA compaiono, ma posso facilmente scartarli con cassette complete Stavo cercando una soluzione con dplyr, solo perché mi piace. Ma la soluzione (hai cancellato?) funziona bene –
Puoi verificare se questo funziona 'library (data.table); setDT (df1) [, id: = cumsum (Tipo == 'gene')] [, lista (Accesion1 = na.omit (Accesion1), Accesion2 = na.omit (Accesion2)), list (id, Start, End)] ' – akrun