2011-05-03 8 views
2

code pour obtenir les trames de données:Fusion des trames de données avec des valeurs manquantes dans R

rat_all = structure(list(frequency = c(37L, 31L, 14L, 11L, 2L, 3L), isoforms = 8:13,  
    type = structure(c("rat_all", "rat_all", "rat_all", "rat_all",    
    "rat_all", "rat_all"), .Dim = c(6L, 1L))), .Names = c("frequency",   
"isoforms", "type"), row.names = 8:13, class = "data.frame") 

rat_ensembl = structure(list(frequency = c(17L, 8L, 20L), isoforms = 8:10,      
    type = structure(c("rat_ensembl", "rat_ensembl", "rat_ensembl"    
    ), .Dim = c(3L, 1L))), .Names = c("frequency", "isoforms",     
"type"), row.names = 8:10, class = "data.frame") 

J'ai deux trames de données:

frequency isoforms  type            
8   17  8 rat_ensembl            
9   8  9 rat_ensembl            
10  20  10 rat_ensembl 

et

frequency isoforms type             
8   37  8 rat_all             
9   31  9 rat_all             
10  14  10 rat_all             
11  11  11 rat_all             
12   2  12 rat_all             
13   3  13 rat_all 

Je voudrais pour les combiner en une seule trame de données, mais aussi pour inclure les entrées manquantes isoforms qui apparaissent dans la trame de données rat_all mais pas la trame de données rat_ensembl . Je voudrais donc que la sortie soit une trame de données combinées comme si je rbinded les deux trames de données, mais Augmentés:

11   0  11 rat_ensembl 
12   0  12 rat_ensembl 
13   0  13 rat_ensembl 

Je pensais que je pouvais le faire avec fusion mais je le vent jusqu'à obtenir un énorme gâchis que je dois me détendre pour que je puisse enfin masser dans le bon format mais ce n'est pas une bonne solution si je veux faire cela pour quatre ou cinq types différents à la fois. Qu'est-ce que je rate? Merci!

Pour être clair, je suis à la recherche d'obtenir une trame de données finale qui ressemble à:

 frequency isoforms  type            
1   17  8 rat_ensembl            
2   8  9 rat_ensembl            
3   20  10 rat_ensembl             
4   37  8 rat_all             
5   31  9 rat_all             
6   14  10 rat_all             
7   11  11 rat_all             
8   2  12 rat_all             
9   3  13 rat_all 
10   0  11 rat_ensembl 
11   0  12 rat_ensembl 
12   0  13 rat_ensembl 

Je sorte de le faire faire ce que je veux si je l'utilise:

z = merge(rat_ensembl, rat_all, by.x="isoforms", by.y="isoforms", all.y=TRUE) 
    isoforms frequency.x  type.x frequency.y type.y       
7   7   44 rat_ensembl   69 rat_all       
8   8   17 rat_ensembl   37 rat_all       
9   9   8 rat_ensembl   31 rat_all       
10  10   20 rat_ensembl   14 rat_all       
11  11   NA  <NA>   11 rat_all       
12  12   NA  <NA>   2 rat_all       
13  13   NA  <NA>   3 rat_all       
14  14   NA  <NA>   1 rat_all    

Ensuite, théoriquement, je pourrais sélectionner les colonnes isoforms, frequency.x, type.x et les corriger afin qu'ils soient corrects pour chacun des rat_ensembl et rat_all puis rbind des trames de données ensemble, mais il semble qu'il devrait y avoir quelque chose à gérer directement.

+0

Qu'avez-vous essayé avec la fusion? Quelles sont les colonnes communes sur lesquelles vous souhaitez fusionner? fréquence, isoformes, type? Tout ce qui précède? Une fois que vous avez identifié les colonnes communes, il s'agit de spécifier si vous souhaitez une jointure interne, gauche, droite ou externe en spécifiant les arguments "tous". Aussi, pouvez-vous mettre à jour votre question avec un extrait de code que les gens peuvent coller dans leurs sessions R? utilisez 'dput()' et collez le contenu dans votre question. – Chase

+0

Merci pour la suggestion dput, c'est très utile. J'ai ajouté les informations supplémentaires à la poste. – rory

Répondre

2

peut-être vous voulez quelque chose comme ça

z <- merge(rat_ensembl, rat_all, all = TRUE) 

iso_diff <- setdiff(rat_all$isoforms, rat_ensembl$isoforms) 

augmented <- data.frame(frequency = 0, isoforms = iso_diff, type = "rat_ensembl", stringsAsFactors= FALSE) 

df_all <- rbind(z, augmented) 

espoir qui aide.

+0

Salut Iselzer, cela semble juste me donner le même résultat que relier les deux trames de données ensemble. Je cherche un moyen d'augmenter cela avec certaines données qui manquent dans l'un des cadres de données. J'ai mis à jour mon message pour être un peu plus clair. Merci! – rory

+0

@rory, je viens de parler de mon anwser pour inclure ce que vous vouliez vraiment. Je ne sais pas s'il y a un moyen plus facile d'y arriver. Si quelqu'un le sait, veuillez le poster. –

+0

Merci Iselzer, la fonction setdiff est une nouvelle pour moi. Je pense que cette solution fonctionnera pour moi, mais cela ne fonctionne que si je suis certain que toutes les différences sont dues à une condition. Dans mon cas, cependant, c'est le cas. Je vous remercie! – rory

Questions connexes