J'ai les données suivantes.frame
Start End Accesion1 Accesion2 1 197 1558 NP_344554 SP_0001
4 Réponses :
Voici une solution utilisant précomptes Cette solution fait l'hypothèse que chaque fois que deux lignes ont le même agrégat () code>
: df2 code> est nécessaire au cas où il existe des rangées non-CDS non générées dans les données originales. ; Afin de regrouper correctement les lignes GENE et CDS, les lignes non-CDS non génique doivent être exclues des deux
x code> et
par code>. (Bien sûr, vos données d'exemple ne contiennent que des lignes Gene et CDS, ce n'est donc pas techniquement nécessaire pour les exemples de données.) P>
Démarrer Code> et
extrémité code>, alors ils doivent être des paires de gènes / CDS (par opposition au gène / gène ou CDS / CDS). P> P>
Merci pour le commentaire. Je n'ai pas vérifié ma solution pour tous les cas que l'OP mentionné cela fonctionne (basé sur les commentaires).
J'aime aussi cette réponse. Merci
Voici un moyen potentiel. Vous choisissez des lignes avec gène et CD. Ensuite, vous regroupez vos données par début et fin. Il peut y avoir des groupes de start / fin avec 1 ou 3 rangées. Vous voulez donc vous assurer que vous choisissez des groupes de démarrage / fin avec deux rangées. De plus, vous voulez vous assurer que vous avez à la fois des gènes et des CD ( longueur (unique (tipo)) == 2 code>). Enfin, vous prenez un élément non NA dans Accession1 et Accession 2.
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
@akrun J'ai été un peu rouillé. Je me demande que l'exemple ci-dessus clarifie votre point. S'il vous plaît laissez-moi savoir si je manque votre point.
Cela signifie-t-il que mes données.frame doivent contenir des facteurs ?. Le mien ne contient pas de facteurs. C'est une base de données simples.frame et votre code ne fonctionne pas.
@AntoniorOdriguezfranco Il n'était pas clair si vous aviez un caractère ou un facteur lorsque j'ai vu votre question. Permettez-moi de réviser ma suggestion.
@AntoniorOdriguezfranco J'ai essayé avec une donnée data.frame contenant Tipo, Accession1 et 2 comme personnage. Mon code a renvoyé le résultat souhaité. Je me demande si quelque chose d'autre se passe.
A produit: p> dplyr code> Version avec
sommariserize_ach code>:
accessionnonx code> variables sont
Je ne sais pas pourquoi mais je ne l'obtiens pas. Un sapply (DF, la classe) me dit que Accèsion1 et 3 sont un caractère. Mais je reçois cet accessionnement de fin de départ1 accesion2 1 197 1558 Na Na 2 1717 2853 NA NA 3 2864 3112 NA NA 4 3196 4311 NA NA 5 4382 4311 NA NA 5 4382 4951 NA NA 6 4952 8461 NA NA 7 8519 8785 NA NA 8 8778 9146 NA NA 9 9151 9273 NA NA 10 9266 10534 NA NA
Je pense sommarise_ach (amusements (max = max (., Na.rm = true)), accession1, accession2) code> peut être nécessaire
@akrun, merci, mes données ont réellement eu les versions de caractères de "
Vous pouvez essayer
Vous devrez peut-être fournir un peu plus de détails sur le point de savoir si
gène / CDS code> se produit par paires ou non. Il n'est pas clair parce que vous avez mentionné qu'il existe d'autres valeurs
ARNA, région, exon code> Supposons, si
df1 $ start [6] <- 2964 code> Quel serait le résultat attendu pour L'exemple de jeu de données
Oui, ils viennent par paires la solution que vous avez donnée semble très bien fonctionner. Parce que certains Tipo supplémentaires sont présents, certains NA apparaissent, mais je peux facilement les jeter avec complète.Cases que je cherchais une solution avec dplyr, juste parce que je l'aime. Mais la solution (vous avez effacée?) Fonctionne bien
Pourriez-vous vérifier si cela fonctionne
Bibliothèque (Data.Table); Setdt (DF1) [ ID: = Cumsum (Tipo == 'Gene')] [ Liste (Accession1 = na.omit (accession1), accession2 = na.omit (accesion2)), liste (ID, début, fin)] code>
Oui, ça fonctionne très bien. J'ai eu les mêmes résultats
Fondamentalement, un duplicata de Stackoverflow.com/q/17328445/817778