使用列表和向量进行映射
mapply with list and vector
假设我有一个包含 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
我做错了什么?
试试这个:
res = mapply(myFun, myList, myVec, SIMPLIFY = FALSE)
我们可以用Map
Map(myFun, myList, myVec)
由 default
SIMPLIFY=FALSE
使用,即
Map
function (f, ...) {
f <- match.fun(f)
mapply(FUN = f, ..., SIMPLIFY = FALSE)
}
假设我有一个包含 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
我做错了什么?
试试这个:
res = mapply(myFun, myList, myVec, SIMPLIFY = FALSE)
我们可以用Map
Map(myFun, myList, myVec)
由 default
SIMPLIFY=FALSE
使用,即
Map
function (f, ...) { f <- match.fun(f) mapply(FUN = f, ..., SIMPLIFY = FALSE) }