2017-01-10 3 views
0

Mon problème est en fait lié à la bioinformatique et à la génétique, mais je vois que cela peut être intéressant pour d'autres programmeurs aussi. En tant qu'arrière-plan, j'ai des listes de mutations, un fichier par échantillon de patient, ce qui signifie que j'ai environ deux cents fichiers individuels. Je veux combiner ces listes et ensuite comparer ces mutations entre différents groupes de patients.Générer des tableaux récapitulatifs à partir de listes (R)

Tous les fichiers d'entrée sont dans le format de liste suivant;

#Variants in patient A: 
Variant1 0.5 
Variant2 0.7 

#Variants in patient B: 
Variant2 0.3 
Variant3 0.6 

#Variants in patient C: 
Variant4 0.5 

Mon problème est que tous les fichiers ne contiennent pas les mêmes variables car les variantes peuvent être uniques et être présentées dans un seul fichier. Je voudrais résumer ces fichiers et générer le fichier de sortie suivant;

  Patient A  Patient B  Patient C 
Variant1 0.5   <NA>   <NA> 
Variant2 0.7   0.3   <NA> 
Variant3 <NA>   0.6   <NA> 
Variant4 <NA>   <NA>   0.5 

Ce que je vous demande est quelques conseils comment générer ce type de fichier de sortie R, dont je suis le plus familier. Tous les exemples de scripts, etc. seraient très appréciés!

MERCI pour votre aide!

+0

Utile http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example Il n'est pas clair comment sont les entrées (ce qui est dans la liste ?, je vois 2? 4? Éléments dans la liste "patient A"). Pls.edit :) – PereG

+0

Chaque liste contient toujours deux colonnes; le nom de variante (par exemple Variant1) et la fréquence d'allèle (par exemple 0,5). La longueur des listes varie; certaines listes peuvent contenir dix variantes alors que certaines listes sont vides. – Jokhe

+0

Pouvez-vous vérifier 'str (patientA)' et 'class (patientA)' - le nom de l'objet dans R qui contient les informations d'un patient-. – PereG

Répondre

2
library(purrr) 
library(stringr) 
library(tidyr) 
file1 <- "#Variants in patient A: 
Variant1 0.5 
Variant2 0.7" 
file2 <- "#Variants in patient B: 
Variant2 0.3 
Variant3 0.6" 
file3 <- "#Variants in patient C: 
Variant4 0.5" 
files <- paste0("file", 1:3) 
files %>% 
    map(~ { 
    patient <- str_extract(readLines(con = textConnection(get(.x)), n = 1L), pattern = "patient\\h+\\w+") 
    data <- read.table(file = textConnection(get(.x)), skip = 1L, stringsAsFactors = FALSE, col.names = c("variant", "value")) 
    cbind(data, patient) 
    }) %>% 
    do.call(what = "rbind") %>% 
    spread(key = patient, value = value) 
+0

Puisque vous semblez préférer 'reshape2' (vous avez manqué la balise au début), vous pouvez remplacer la dernière ligne par' reshape2 :: dcast (variant ~ patient) '. Personnellement, je préfère le paquet 'tidyr' plus moderne. –

-1

vos données En supposant par exemple était une partie d'un fichier, lu dans le fichier avec readLines, identifier les lignes id avec grep puis boucle sur ceux-ci.

text <- readLines("myfile.txt") 

patients <- grep("#", text) 

plyr::ldply(1:length(patients), function(i){print(i) 
    start <- patients[i] 
    end <- c(patients[-1], length(text) + 1)[i] 
    x <- read.table("myfile.txt", skip = start, nrows = end - start - 1, comment.char = "", blank.lines.skip = FALSE) 
    names(x) <- c("variant", "value") 
    x$patient <- gsub("^.*patient\\s+(.*):$", "\\1", text[start]) 
    x 
}) 

filtre les lignes avec NA, puis utiliser tidyr :: diffusion si vous voulez vraiment les données e dans le format que vous utilisez ci-dessus plutôt que d'un format bien rangé.