2017-02-24 5 views
0

Zum Beispiel I eine Matrix 3x3 haben, möchte ich eine Funktion anzuwenden, die zwischen I [1,1] & & hergestellt [1,2] und [1,1] & & [1, 3] dann [1,2] & & [1,3] (eine Kombination).Compute eine paarweise in Funktion R

Dann gehe ich in die nächste Zeile

Dies ist ein Beispiel meiner Matrix ist

 [,1] [,2] [,3] 
[1,] -0.2 0.52 0.36 
[2,] -0.2 0.66 0.50 
[3,] 0.8 0.10 1.00 

Und ich habe diese Funktion anwenden:

Fst <- function (x,y) { 
    F = sd(c(x,y))/(mean(c(x,y)) * (1-mean(c(x,y)))) 
    F 
} 

Hat jemand wissen, wie man mach das ??? Vielen Dank im Voraus

+1

Verwenden Sie die '? Combn' – akrun

+2

ich wohl weiß, wie dies zu tun, aber der beste Ansatz hängt natürlich von dem speziellen Beispiel (und die Funktion, die Sie insbesondere anwenden möchten). – Roland

+0

Danke @jogo, ich bin ein Neuling auf stackoverflow :) – Erika

Antwort

0

Dies wird tun, was Sie wollen:

m <- matrix(c(-0.2, 0.52, 0.36, -0.2, 0.66, 0.50, 0.8, 0.10, 1.00), 3, 3, byrow=TRUE) 
m  
myfun <- function(x) { 
    apply(combn(x,2), 2, function(x) sd(x)/mean(x)/(1-mean(x))) 
} 
apply(m, 1, myfun) 
# > apply(m, 1, myfun) 
#   [,1]  [,2]  [,3] 
# [1,] 3.7880720 3.433720 1.999898 
# [2,] 5.3801603 3.882155 1.571348 
# [3,] 0.4591602 0.464438 2.571297 

apply(m, 1, myfun) Arbeiten in jeder Zeile (die Ergebnisse für die erste Zeile werden die ersten Elemente in der resultierenden Matrix, dh in der ersten Spalte sein) . combn(x,2) erzeugt die Paare - spaltenweise in einer Matrix gespeichert, siehe combn(11:15, 2). Ein weiterer apply() arbeitet an jeder Spalte dieser Matrix.
Ich habe Ihre Funktion geändert, weil sd() und mean() auf Vektoren arbeiten.

+0

Vielen Dank !!!! – Erika

+0

http://StackOverflow.com/Help/Someone-answers – jogo

1

Es ist nicht notwendig, Zeilen zu durchlaufen. Sie können es effizient für alle gleichzeitig tun, wenn Sie Ihre Funktion vektorisieren. Verwenden Sie Vectorize, wenn Sie es nicht ändern möchten.

m <- matrix(c(-0.2, -0.2, 0.8, 0.52, 0.66, 0.10, 0.36, 0.50, 1), 3) 

library(matrixStats) 
Fst_vectorized <- function (x,y) { 
    X <- cbind(x, y) 
    F = rowSds(X)/(rowMeans(X) * (1-rowMeans(X))) 
    F 
} 

Fst(m[1,1], m[1,2]) 
#[1] 3.788072 

res <- combn(as.data.frame(m), 2, FUN = function(x) Fst_vectorized(x[[1]], x[[2]])) 
colnames(res) <- combn(seq_len(ncol(m)), 2, 
         FUN = function(x) paste(x[[1]], x[[2]], sep = "vs")) 
#   1vs2  1vs3  2vs3 
#[1,] 3.788072 5.380160 0.4591602 
#[2,] 3.433720 3.882155 0.4644380 
#[3,] 1.999898 1.571348 2.5712974 
+0

Danke !!!! Wenn ich versuche, colnames hinzuzufügen, habe ich den Fehler 'Fehler in 'colnames <-' (' * tmp * ', Wert = c (" 1vs2 "," 1vs3 "," 2vs3 ")): Länge von' dimnames '[ 2] nicht gleich Array Extent ' – Erika

+0

Dieser Code wie angegeben wird ohne Fehler ausgeführt. Wenn Sie einen Fehler erhalten, haben Sie etwas geändert. – Roland

Verwandte Themen