微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 mapply 或 lapply 到嵌套列表 结果

如何解决使用 mapply 或 lapply 到嵌套列表 结果

我想将示例函数应用于嵌套列表(我将称此列表为 bb),并且我还有一个数字列表(我将称此列表为 k)要在样本函数。我希望 k 中的每个数字都遍历 bb 中每个列表的所有值。如何使用 mapplylapply 执行此操作?

数据如下:

k <- list(1,2,4,3) #this is the list of numbers to be supplied in the `sample.int` function
b1 <- list(c(1,3),c(2,3,4),c(3,5),c(4,5,6)) #The first list of bb
b2 <- list(c(1,2),c(5,6)) #The second list of bb
bb <- list(b1,b2) #This is list bb containing b1 and b2 whose values are to be iterated through

我创建了这个 mapply 函数,但没有得到预期的结果:

mapply(function(x,y) { 
   x[sample.int(y,y,replace = TRUE)] 
},bb,k,SIMPLIFY = FALSE)

这仅返回 10 个输出值,但我希望每个 k 数循环遍历 bb 中两个列表的所有值,因此 {{1} 中的两个列表应该有 10*2 个输出}.我可能以错误的方式使用 bb,因此如果有人能指出我正确的方向,我将不胜感激!

解决方法

outer 是你的朋友。它通常用于计算外矩阵乘积。 考虑:

outer(1:3,2:4)
1:3 %o% 2:4  ## or
#      [,1] [,2] [,3]
# [1,]    2    3    4
# [2,]    4    6    8
# [3,]    6    9   12

它还具有默认为 FUN="*" 参数。然而,它使您能够计算 xy cross-wise 组合上的任何函数,即 x[1] X y[1],x[1] X y[2],...*apply 函数仅计算 { {1}}。所以让我们做吧:

x[1] X y[1],x[2] X y[2],...

这个结果看起来有点奇怪,但我们很容易FUN <- Vectorize(function(x,y) x[sample.int(y,y)]) set.seed(42) res <- outer(bb,k,FUN) res # [,1] [,2] [,3] [,4] # [1,] List,1 List,2 List,4 List,3 # [2,3 它。

unlist

结果

res <- unlist(res,recursive=F)

瞧,20 个结果。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。