R stosuje funkcję z wieloma parametrami


128

Mam funkcję f(var1, var2)w R. Załóżmy, że ustawiamy var2 = 1i teraz chcę zastosować tę funkcję f()do listy L. Zasadniczo chcę uzyskać nową listę L * z wyjściami

[f(L[1],1),f(L[2],1),...,f(L[n],1)]

W jaki sposób mogę to zrobić z albo apply, mapplyalbo lapply?


Odpowiedzi:


190

Po prostu przekaż var2 jako dodatkowy argument do jednej z funkcji stosujących.

mylist <- list(a=1,b=2,c=3)
myfxn <- function(var1,var2){
  var1*var2
}
var2 <- 2

sapply(mylist,myfxn,var2=var2)

To przechodzi tak samo var2do każdego wywołania myfxn. Jeśli zamiast tego chcesz, aby każde wywołanie of myfxnotrzymało 1/2/3 / itd. element obu mylisti var2, to jesteś w mapplydomenie.


5
ale zauważ, że myfxnmoże być wektoryzowana, w takim przypadku należy użyćmyfxn(unlist(mylist), var2=var2)
baptiste

Oryginalny przykład był niejasny, ale wydawał się być niewektoryzowany. Punkt jednak dobrze przyjęty.
Ari B. Friedman

Czy jest sposób, aby ta funkcja działała „w locie”? Coś takiego: sapply(mylist, function(var1, var2) { var1*var2 }, var=thisvar2)Ale
pojawia

1
@emudrak Myślę, że problem polega na tym, że nazywasz argument, który przekazujesz, varzamiast go var2. R nie potrafię odgadnąć, co masz na myśli.
Ari B. Friedman

49

Jeśli twoja funkcja ma dwie zmienne wektorowe i musi obliczyć się na każdej z nich (jak wspomniał @Ari B. Friedman), możesz użyć mapplyw następujący sposób:

vars1<-c(1,2,3)
vars2<-c(10,20,30)
mult_one<-function(var1,var2)
{
   var1*var2
}
mapply(mult_one,vars1,vars2)

co daje:

> mapply(mult_one,vars1,vars2)
[1] 10 40 90

3
Jeden głos za uogólnieniem, nawet z prostym i jasnym przykładem.
JASC

mapplybędzie również poddawany recyklingowi, jeśli vars1ma pojedynczy element. Na przykład kiedy vars1 <- 3, mapply(mult_one, vars1, vars2)powraca 30 60 90. Jest to przydatne, gdy chcesz użyć lapplydrugiego argumentu funkcji.
Paul Rougieux

3

Aby bardziej uogólnić przykład @ Alexandra, outerjest istotny w przypadkach, gdy funkcja musi obliczyć się na każdej parze wartości wektorów:

vars1<-c(1,2,3)
vars2<-c(10,20,30)
mult_one<-function(var1,var2)
{
   var1*var2
}
outer(vars1,vars2,mult_one)

daje:

> outer(vars1, vars2, mult_one)
     [,1] [,2] [,3]
[1,]   10   20   30
[2,]   20   40   60
[3,]   30   60   90
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.