7
votes

Combinaison de colonnes (collé)

J'ai les données suivantes.frame

Start End Accesion1 Accesion2
1 197 1558 NP_344554 SP_0001


5 commentaires

Vous devrez peut-être fournir un peu plus de détails sur le point de savoir si gène / CDS 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 Supposons, si df1 $ start [6] <- 2964 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)]


Oui, ça fonctionne très bien. J'ai eu les mêmes résultats


Fondamentalement, un duplicata de Stackoverflow.com/q/17328445/817778


4 Réponses :


3
votes

Voici une solution utilisant agrégat () : xxx

précomptes df2 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 et par . (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.)

Cette solution fait l'hypothèse que chaque fois que deux lignes ont le même Démarrer et extrémité , alors ils doivent être des paires de gènes / CDS (par opposition au gène / gène ou CDS / CDS).


2 commentaires

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



2
votes

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


4 commentaires

@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.



4
votes

A dplyr Version avec sommariserize_ach : xxx

produit: xxx p > Suppose accessionnonx variables sont caractères (ne fonctionne pas avec facteur), ainsi que la condition que les paires d'extrémités ne contiennent que deux valeurs, chacune de TIPO et GENE, comme dans votre ensemble de données.


3 commentaires

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) peut être nécessaire


@akrun, merci, mes données ont réellement eu les versions de caractères de "" donc cela fonctionnait bien de cette façon.



4
votes

Vous pouvez essayer xxx


0 commentaires