2016-08-18 2 views
1

sagen, dass ich N identisch (gleiche Anzahl von Zeilen und Spalten) Datenrahmen haben:Funktion jeder Zelle über mehrere Datenrahmen in R

set.seed(2) 
df1 <- data.frame(replicate(100,rnorm(100))) 
df2 <- data.frame(replicate(100,rnorm(100))) 
dfN <- data.frame(replicate(100,rnorm(100))) 

Und ich möchte eine Funktion anzuwenden (in diesem Fall t.test()) über jeder "Zelle" von N Datenrahmen, so dass, was zurückkommt, ist ein separater Datenrahmen, der einen Wert für jeden durchgeführten Zellentest enthält. Im Wesentlichen will, muss ich die erste Zelle eines jeden Datenrahmen nehmen,

one <- df1[1,1] 
two <- df2[1,1] 
Nth <- dfN[1,1] 

eine t.test() auf diesen Zellen durchführen,

first.cell.each <- cbind.data.frame(one,two,Nth) 
t.test(first.cell.each, mu=0) 

Und wiederholen, dass in allen Zellen (in diesem Fall 10000).

edit: geklärte

+0

@ZheyuanLi, meine Entschuldigung, Ich hätte klarer sein sollen. Identisch in Bezug auf die Anzahl der Zeilen und Spalten. – DrPineapple

+3

Sie verwenden die falsche Datenstruktur. Kombinieren Sie die data.frames zu einem Array und verwenden Sie apply. – Roland

+0

Sie können jetzt das neue 'tidyr'-Paket verwenden, um mehrere Datenrahmen zu kombinieren und ihre Daten zu verschieben. Siehe https://blog.rstudio.org/2014/07/22/introducing-tidyr/ – smci

Antwort

2

Wir können eine matrix erstellen die Ausgabe von p.value von t.test speichern die gleichen Abmessungen der einzelnen Datensätze haben. Durchlaufen Sie dann die Reihenfolge der Zeilen und Spalten, extrahieren Sie die Elemente aus den einzelnen Datasets, verketten Sie sie und führen Sie den Befehl t.test aus, und weisen Sie die Ausgabe demselben Zeilen-/Spaltenindex von 'res' zu.

res <- matrix(, ncol=100, nrow=100) 
for(i in seq_len(nrow(df1))){ 
for(j in seq_len(ncol(df1))){ 
    res[i,j] <- t.test(c(df1[i,j], df2[i,j], dfN[i,j]), mu = 0)$p.value 

}} 

Mein Code gibt auch eine 100 * 100 Matrix

str(res) 
#num [1:100, 1:100] 0.629 0.5 0.131 0.769 0.348 ... 

Wenn viele Datensätze sind, können wir es in einem list platzieren können, wandeln sie dann zu einem array und tun das t.test Verwenden apply

lst <- mget(paste0("df", c(1, 2, "N"))) 
ar1 <- array(unlist(lst), dim = c(dim(df1), length(lst))) 
res2 <- apply(aperm(ar1, c(3, 1, 2)), c(2,3), FUN = function(x) t.test(x, mu = 0)$p.value) 
str(res2) 
# num [1:100, 1:100] 0.629 0.5 0.131 0.769 0.348 ... 
1

Angenommen, Sie haben alle Ihre Datenrahmen s aved in einer Liste datlst, tut dies das Werk

z <- matrix(tapply(unlist(datlst, use.names = FALSE), 
        rep(gl(prod(dim(datlst[[1]])), 1), length(datlst)), 
        FUN = function (u) t.test(u, mu = 0)$p.value), 
      nrow = nrow(datlst[[1]])) 

Mit Ihrem Beispiel Datenrahmen datlst <- list(df1, df2, dfN), mein Code, den Sie erfolgreich zurückgegeben wird eine 100 * 100 Matrix:

str(z) 
# num [1:100, 1:100] 0.629 0.5 0.131 0.769 0.348 ... 
Verwandte Themen