2016-09-01 3 views
1

Ich möchte eine multivariable Funktion definieren und dann auf einem Array von Vektoren arbeiten, mit den Elementen der Vektoren die Werte der Variablen. Ersetzen Sie das Array durch ein Array der Ausgaben der Funktion. Bei einer Version mit zwei Variablen funktioniert die äußere (oder äußere + Vektorisierung) -Option. Aber für höhere Dimensionen kann ich nicht auf etwas Sauberes und Transparentes kommen.Multivariable Funktion auf einem Array von Vektoren in R

Ich werde ein Zwei-Variablen (zwei-dimensional) Beispiel verwenden, bin aber an einer Lösung interessiert, die nicht darauf beschränkt ist.

definieren Vektoren, beispielsweise Temperaturen und Zeiten:

temp=seq(10,50,10) 
time=seq(5,10,1) 

Dieses verwendet werden könnte unter Verwendung eines Arrays expand.grid

arrayInput <- expand.grid(temp=seq(10,50,10), time=seq(5,10,1)) 

Der Ausgang ist eine Anordnung von 30 Reihen zu konstruieren, durch 2 Spalten. Kann jetzt eine Funktion von Temperatur und Zeit definieren.

func <- function(temp, time) time*exp(-1/temp) 

Was würde ich zu tun ist arrayInput neu anordnen, so dass sie ein Array mit der Dimension 5 x 6 x 2 und den Betrieb auf diesem Array mit FUNC einen 5 x 6 Array von Werten für die Funktion gegeben erzeugen die Paar von Eingaben, Temp und Zeit.

So etwas ist in Mathematica mit Apply einfach. Ich habe einige Möglichkeiten gefunden, dies in R zu tun, aber sie sind hässlich, behalten Sie nicht die Namen der Variablen usw., was es weniger klar macht, was der Code macht.

Wer weiß, eine schöne Weise, dies zu erreichen? Wie gesagt, wenn ich eine Funktion von 5 Variablen hätte, würde ich gerne in der Lage sein, die Operation auf die gleiche Weise auszuführen.

Danke,

Steve

+0

Eine nette Funktion ist "äußere". Ich denke, dies berechnet Ihre gewünschte Ausgabe, obwohl die Eingabe nur die anfänglichen Vektoren ist: "äußere (seq (10,50,10), seq (5,10,1), Funktion (temp, time) time * exp (-1/temp)) ' – lmo

+0

Danke, ich erwähnte äußerlich im ersten Absatz, und es ist nett, und vielleicht könnte ich dies auf höhere äußere (äußere()) Dimensionen erweitern. – SteveK

+0

Jemand nahm einen Riss bei einer 'multi.outer' Funktion hier: http://stackoverflow.com/questions/6192848/how-to-generalize-outer-to-n-dimensions – SteveK

Antwort

1

Sie dies tun können:

dim(matInput) <- c(5, 6, 2) 
#or matInput <- array(matInput, dim = c(5, 6, 2)) 

func(matInput[,,1], matInput[,,2]) 
#   [,1]  [,2]  [,3]  [,4]  [,5]  [,6] 
#[1,] 4.524187 5.429025 6.333862 7.238699 8.143537 9.048374 
#[2,] 4.756147 5.707377 6.658606 7.609835 8.561065 9.512294 
#[3,] 4.836081 5.803297 6.770513 7.737729 8.704945 9.672161 
#[4,] 4.876550 5.851859 6.827169 7.802479 8.777789 9.753099 
#[5,] 4.900993 5.881192 6.861391 7.841589 8.821788 9.801987 

Aber ich verstehe nicht, warum Sie hier ein Array verwenden müssen. Verwenden Sie einen data.frame wie alle anderen auch. R ist nicht Matlab.

+0

Danke. Ich habe versucht, genau das zu tun, was Sie in der ersten Zeile mit einem data.frame haben: > dfInput <- expand.grid (temp = seq (10,50,10), Zeit = seq (5,10,1)) > dim (dfInput) <- c (5,6,2) Fehler im Dim (dfInput) <- c (5, 6, 2): Dims [Produkt 60] stimmen nicht mit der Länge des Objekts überein [2] Ich habe keinen Anhang zu Arrays, oder Mathematica (nicht Matlab), die ich in einem Jahrzehnt nicht verwendet habe. Mein Wissen über R ist schlecht, weil ich das nur gelegentlich mache. Danke für die Lösung. Ich muss den Unterschied zwischen den beiden Konstrukten verstehen (mit und ohne data.matrix, die es einhüllt). – SteveK

Verwandte Themen