Сопоставить со списком и вектором

Скажем, у меня есть список с 3 элементами, каждый из которых представляет собой фрейм данных, вектор с 3 элементами, и я хочу применить функцию к каждому элементу списка и его соответствующему элементу в векторе. Конечно, я мог бы сделать это с помощью цикла, но я пытаюсь векторизовать это mapply, Вот что я делаю

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 это не то, что я ожидал:

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   

я ожидал список из трех элементов, каждый из которых представлял собой фрейм данных с двумя столбцами, например:

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

Что я делаю неправильно?

2 ответа

Решение

Попробуй это:

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

Мы можем использовать Map

Map(myFun, myList, myVec)

который использует defaultSIMPLIFY=FALSE т.е.

Map  
function (f, ...)  {
f <- match.fun(f)
mapply(FUN = f, ..., SIMPLIFY = FALSE) 
}
Другие вопросы по тегам