2016-04-29 5 views
1

Ich habe ein Datenframe, das 214 Spalten lang und viele Zeilen lang ist, und ich möchte einen genauen Fischer-Test für jede Zeile mit Werten aus 4 Spalten durchführen.Fisher's exakter Test auf Werte von großen Datenrahmen und Umgehungsfehler

Ein Beispiel Teilmenge von relevanten Informationen aus meinem Datenrahmen wie folgt aussieht:

Variant DB.count.1 DB.count.2 pop.count.1 pop.count.2 
A   23   62   35    70 
B   81   4    39    22 
C   51   42   49    52 
D   NA   NA   65    8 
E   73   21   50    33 
F   72   13   81    10 
G   61   32   75    21 
H   NA   NA   42    22 
I   NA   NA   60    20 
J   80   12   72    24 

Ich versuche, ein zu for-Schleife zu verwenden:

  1. eine Kontingenztabelle für den Fishers exaktem für jede Zeile erstellen Vergleichen Sie DB.counts mit pop.counts
  2. Führen Sie einen exakten Fisher-Test mit dieser Kontingenztabelle aus, um festzustellen, ob zwischen DB.counts und pop.counts ein Unterschied besteht
  3. Ausgang der p-Wert auf eine neue Spalte auf meinem Datenrahmen führen

Wie Sie es „NA“ Werte in einigen Positionen sehen können und somit in einigen Kontingenztafeln, offensichtlich ist dies ein Fehler verursacht wird, was in Ordnung ist , aber ich möchte, dass der Code einen Wert an die Spalte ausgibt, wenn er auf diesen Fehler wie "." oder "error" und springt zur nächsten Zeile/Kontingenztabelle.

also würde ich eine Ausgabe wie die wie folgt aussieht:

Variant DB.count.1 DB.count.2 pop.count.1 pop.count.2 fishers 
A   23   62   35    70    0.4286 
B   81   4    39    22    <0.0001 
C   51   42   49    52    0.3921 
D   NA   NA   65    8    error 
E   73   21   50    33    0.0143 
F   72   13   81    10    0.5032 
G   61   32   75    21    0.0744 
H   NA   NA   42    22    error 
I   NA   NA   60    20    error 
J   80   12   72    24    0.0425 

Der Code, den ich zur Zeit haben (basierend auf R loop over Fisher test - Error message) ist:

df$fishers" <- for (i in 1:nrow(df)) 
{ 
table <- matrix(c(df[i,4], df[i,5], df[i,2], df[i,3]), ncol = 2, byrow = TRUE) 
fisher.test(table, alternative="greater") 
} 

Dies scheint die Kontingenztafeln die Art und Weise zu erstellen Ich möchte aber das Problem umgehen, die Fehler zu umgehen und den p-vlaue auf die neue Spalte zu drucken. Ich habe versucht, try und tryCatch zu verwenden, war aber nicht erfolgreich.

Ich bin ein R Anfänger so wirklich schätzen alle Ratschläge, wie Sie meine Fragen oder einen Rat für mein Problem zu verbessern! Vielen Dank!

Edit 1: Ich habe jetzt versucht mit der data.table-Paket wie unten und habe, was ich brauche von Datensätzen mit "NA" -Werte aber wie überspringe ich die Fehler und machen den Code weiter? Vielen Dank!!!

library(data.table) 
dt <- data.table(df) 

dt[, p.val := fisher.test(matrix(c(pop.count.1, pop.count.2, DB.count.1, DB.count.2), ncol=2), workspace=1e9)$p.value, by=Variant] 

df <- as.data.frame(dt) 
+0

'gelten (dd [, -1], 1, Funktion (x) tryCatch (format.pval (fisher.test (Matrix (x, 2)) $ p.value, eps = .001), Fehler = Funktion (e) 'Fehler')) 'Arbeit? – rawr

+0

Danke, aber leider nicht, das gibt einen Fehler für jede Zeile in df $ fishers :( – emily

+0

Entfernen Sie NA Datensätze aus Ihrem Dataset - 'no.na.df <- df [complete.cases (df),]' –

Antwort

1

Sie können eine if-else Anweisung in der Schleife wie folgt umfassen:

res <- NULL 
for (i in 1:nrow(df)){ 
    table <- matrix(c(df[i,4], df[i,5], df[i,2], df[i,3]), ncol = 2, byrow = TRUE) 
# if any NA occurs in your table save an error in p else run the fisher test 
    if(any(is.na(table))) p <- "error" else p <- fisher.test(table, alternative="greater")$p.value 
    # save all p values in a vector 
    res <- c(res,p) 
} 
df$fishers <- res 

oder den Code in Funktion setzen und statt einer Schleife anwenden verwenden:

foo <- function(y){ 
    # include here as.numeric to be sure that your values are numeric: 
    table <- matrix(as.numeric(c(y[4], y[5], y[2], y[3])), ncol = 2, byrow = TRUE) 
    if(any(is.na(table))) p <- "error" else p <- fisher.test(table, alternative="greater")$p.value 
    p 
} 
df$fishers <- apply(df, 1, foo) 
+0

Das ist perfekt danke vielen Dank! – emily

+0

@emily Bitte beachten Sie, die Antwort als akzeptiert zu markieren, wenn es Arbeit angemessen ist. – Jimbou

Verwandte Themen