2017-11-24 3 views
1

ich auf Daten von mehreren Gruppen einen gekoppeltes t-Test an Durchführung und möchte „Export“ diese in eine CSV-Dateischreiben Ergebnisse gepaart t.test in csv

Hier die Daten:

table <- read.table(text=' group M1  M2 
Group 1 0.5592884 0.5592884 
Group 1 0.3481799 0.3481799 
Group 1 0.2113786 0.2113786 
Group 1 0.2817871 0.2817871 
Group 2 0.2543952 0.2543952 
Group 2 0.2016288 0.2016288 
Group 2 0.2098503 0.2098503 
Group 2 0.1060097 0.1060097 
Group 3 0.2405704 0.2405704 
Group 3 0.3200119 0.3200119 
Group 3 0.2453895 0.2453895 
Group 3 1.3107510 1.3107510 
Group 4 0.8600338 0.8600338 
Group 4 0.5381423 0.5381423 
Group 4 0.7348685 0.7348685 
Group 4 0.2969512 0.2969512', header=TRUE) 

wie ich will nicht M1 bis M2 vergleichen, sondern die Gruppen miteinander führe ich das gekoppelte t.test wie folgt:

sig<-lapply(table[2:3], function(x) 
    pairwise.t.test(x, table$group, 
        p.adjust.method = "BH")) 

da jedoch das Ergebnis eine Liste ist, kann ich nicht schreiben, ist in eine .csv-Datei mit diesem:

sink('test.csv') 
cat('paired t results') 
write.csv(sig) 
sink() 

ich mithilfe von capture.output zu umgehen versucht, aber dies löst die Trennung

sig_output<-capture.output(print(sig)) 

ist es eine Möglichkeit, direkt zu sig in eine CSV-Datei oder einen workouround zu schreiben?

Vielen Dank!

Antwort

2

Verwenden Sie einfach print nach sink:

print(sig) 

Aber beachten Sie, dass das Ergebnis ist nicht eine CSV-Datei, im Gegensatz zu dem, was Ihr Code sagt. Wenn Sie nur den p-Wert Tabelle speichern möchten, können Sie so etwas wie die folgenden Möglichkeiten:

save_p_values = function (test_data, filename) { 
    write.csv(test_data$p.value, filename) 
} 

Map(save_p_values, sig, paste0(names(sig), '.csv')) 

Um beide Tabellen in derselben Datei zu erhalten, müssen Sie eine Spalte hinzufügen, die sie auszeichnet; mit :

sig_combined = sig %>% 
    # Extract p-value tables 
    map(`[[`, 'p.value') %>% 
    # Convert matrix to data.frame so we can work with dplyr 
    map(as.data.frame) %>% 
    # Preserve rownames by saving them into column: 
    map(tibble::rownames_to_column, 'Contrast') %>% 
    # Add name of column that t-test was performed on 
    map2(names(.), ~ mutate(.x, Col = .y)) %>% 
    # Merge into one table 
    bind_rows() 

write.csv(sig_combined, 'results.csv') 
+0

Danke, die zweite Option funktioniert gut für mich! Gibt es eine Chance, dass ich die Ergebnisse für M1 und M2 in eine Datei statt in zwei schreiben kann? Prost :) –

+0

@KevinRoth Ja, Sie können das 'append = TRUE'-Argument in' write.csv' setzen und dann einfach den gleichen Dateinamen verwenden. Aber in diesem Fall würde ich wahrscheinlich zuerst die Tabellen verketten und sie anschließend einmal schreiben. –

+1

@KevinRoth Siehe aktualisierte Antwort. Es ist ein bisschen mehr Aufwand. Wenn Sie mit den Paketen, die ich verwendet habe, nicht vertraut sind, sollten die Empfehlungen hilfreich sein. Kurz gesagt, [purrr :: map "ist wie" lapply "auf Steroiden] (https://stackoverflow.com/a/47123420/1968), und dplyr ist die Zukunft der strukturierten Tabellenmanipulation in R. –