2016-05-24 1 views
2

J'ai un data.frame avec 3 colonnes. J'ai beaucoup de différentes "souches" avec beaucoup de différents "TE" correspondant à leur fréquence. Ce que je veux faire, c'est pour chaque TE savoir combien de souches sont dans la même gamme pour une valeur donnée de TEfréquence.Données de sous-ensemble utilisant deux variables et le résumant

dt <- as.data.table(read.table(header=TRUE,text="  strain TE  TEfrequency 
    1 S1 FBti0015567 0.000000 
    2 S2 FBti0015567 0.000000 
    3 S3 FBti0015567 42.857143 
    4 S1 FBti0018865 25.000000 
    5 S2 FBti0018865 3.225806 
    6 S3 FBti0018865 33.333333")) 



> head(dt) 
    strain TE  TEfrequency 
    1 S1 FBti0015567 0.000000 
    2 S2 FBti0015567 0.000000 
    3 S3 FBti0015567 42.857143 
    4 S1 FBti0018865 25.000000 
    5 S2 FBti0018865 3.225806 
    6 S3 FBti0018865 33.333333 

Par exemple, dans ce jeu de données factice pour FBti0015567

si je veux interroger pour des fréquences inférieures à 10% j'obtenir un 2 pour FBti0015567 (S1 + S2) et 1 pour FBti0018865 (S2).

TE num_strains 
FBti0015567 2 
FBti0018865 1 

Pour une requête de> 20%

TE num_strains 
FBti0015567 1 
FBti0018865 2 

Mon approche naïve est de faire un sous-ensemble pour chaque combinaison de valeurs, mais cela est impossible parce que j'ai plus de 40 souches et plus de 1400 TE de . Existe-t-il un moyen facile d'obtenir un tableau résumant ces informations par TE avec un intervalle de fréquence d'entrée?

Merci d'avance.

+0

pourrait vous fournissez un petit exemple de jeu de données et le résultat attendu pour le tableau d'exemple que vous avez déjà fourni? – lmo

+0

J'ai emprunté le code pour l'ensemble de données de MikeyMike et ajouté quelques exemples de sortie. – biojl

Répondre

2

Si j'interprète la question correctement, vous voulez pour chaque combinaison TE & TEfréquence le nombre de déformations uniques. Data.table est génial et vous pouvez le faire en 1 étape si vous le souhaitez.

library(data.table) 

dt <- as.data.table(read.table(header=TRUE,text="  strain TE  TEfrequency 
    1 S1 FBti0015567 0.000000 
    2 S2 FBti0015567 0.000000 
    3 S3 FBti0015567 42.857143 
    4 S1 FBti0018865 25.000000 
    5 S2 FBti0018865 3.225806 
    6 S3 FBti0018865 33.333333")) 

dt[,list(count_uniq_strain=length(unique(strain))),by=list(TE,TEfrequency)][TEfrequency < 10] 

      TE TEfrequency count_uniq_strain 
1: FBti0015567 0.000000     2 
2: FBti0018865 3.225806     1 

Je suppose que "le filtrage par des fréquences inférieures à 10%", vous voulez dire laisser tomber les observations avec TEfrequency < 10.

Edit: Ajout d'une fonction de requête:

dt2<-dt[,list(count_uniq_strain=length(unique(strain))),by=list(TE,TEfrequency)] 

query <- function(inds,condition){ 
    return(inds[eval(parse(text=condition))]) 
} 

filter_gt_20 <- query(inds=dt2,condition="TEfrequency > 20") 
filter_lt_10 <- query(inds=dt2,condition="TEfrequency < 10") 


> filter_gt_20 
      TE TEfrequency count_uniq_strain 
1: FBti0015567 42.85714     1 
2: FBti0018865 25.00000     1 
3: FBti0018865 33.33333     1 
> filter_lt_10 
      TE TEfrequency count_uniq_strain 
1: FBti0015567 0.000000     2 
2: FBti0018865 3.225806     1 
+0

C'est presque ce que je veux. J'ai mis à jour la question pour mieux m'expliquer avec 2 exemples. Quand je dis filtre, je veux dire donner une gamme de fréquences d'entrée. – biojl

+0

Vous pouvez facilement changer le 'TEfrequency <10' à' TEfrequency> 20' si vous voulez. Ou vous pouvez vous débarrasser complètement du code 'TEfrequency <10' et sauvegarder la table de données puis filtrer en fonction de ce que vous voulez. De cette façon, vous n'avez qu'à faire un résumé. –

+0

Apparemment, il ne met pas les en > sous-ensemble (filter_lt_10, TE == 'FBti0015567') TE TEfrequency count_uniq_strain 1: FBti0015567 0,000000 34 2: FBti0015567 4,000000 1 3: 5,263158 FBti0015567 2 4: FBti0015567 9,090909 3 5 : FBti0015567 2,500000 1 6: 3,333333 FBti0015567 2 7: FBti0015567 6,060606 1 8: FBti0015567 5,154639 1 Ils doivent être seulement une TE et un comptage pour la fréquence donnée. Peut-être que nous pouvons utiliser agrégé? – biojl