2016-06-02 16 views
0

Sagen wir, ich habe eine Liste mit 3 Elementen - jedes ist ein Datenrahmen -, ein Vektor mit 3 Elementen, und ich möchte eine Funktion auf jedes Element der Liste und ihr jeweiliges Element anwenden der Vektor. Natürlich könnte ich das mit einer Schleife machen, aber ich versuche es mit mapply zu vektorisieren. Hier ist, was ich tueMapply mit Liste und Vektor

myList = list(data.frame(x = 1:10), data.frame(x = 1:5), data.frame(x = 6:1)) 
myVec = c(7, 1, 9) 
myFun = function(x, y) { 
    x$number = y 
    return(x) 
} 
res = mapply(myFun, myList, myVec) 

res ist nicht das, was ich erwartet hatte:

str(res) 
List of 6 
$ : int [1:10] 1 2 3 4 5 6 7 8 9 10 
$ : num [1:10] 7 7 7 7 7 7 7 7 7 7 
$ : int [1:5] 1 2 3 4 5 
$ : num [1:5] 1 1 1 1 1 
$ : int [1:6] 6 5 4 3 2 1 
$ : num [1:6] 9 9 9 9 9 9 
- attr(*, "dim")= int [1:2] 2 3 
- attr(*, "dimnames")=List of 2 
    ..$ : chr [1:2] "x" "number" 
    ..$ : NULL 

was ich erwartet hatte eine Liste mit drei Elementen war, die jeweils ein Datenrahmen mit zwei Spalten zu sein, etwa so:

str(expected) 
List of 3 
$ :'data.frame': 10 obs. of 2 variables: 
    ..$ x  : int [1:10] 1 2 3 4 5 6 7 8 9 10 
    ..$ number: num [1:10] 7 7 7 7 7 7 7 7 7 7 
$ :'data.frame': 5 obs. of 2 variables: 
    ..$ x  : int [1:5] 1 2 3 4 5 
    ..$ number: num [1:5] 1 1 1 1 1 
$ :'data.frame': 6 obs. of 2 variables: 
    ..$ x  : int [1:6] 6 5 4 3 2 1 
    ..$ number: num [1:6] 9 9 9 9 9 9 

was mache ich falsch?

Antwort

0

Try this:

res = mapply(myFun, myList, myVec, SIMPLIFY = FALSE) 
2

Wir können Map

Map(myFun, myList, myVec) 

die SIMPLIFY=FALSE von default verwendet das heißt

Map 
function (f, ...) { 
f <- match.fun(f) 
mapply(FUN = f, ..., SIMPLIFY = FALSE) 
}