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

使用mapply使用多个参数从嵌套列表中的元素中进行选择

如何解决使用mapply使用多个参数从嵌套列表中的元素中进行选择

很抱歉,如果已经在某个地方回答了这个问题,但是我检查了所有可以找到的页面,但找不到针对该特定问题的解决方案。

我想使用apply函数从嵌套在列表中的列表中选择元素。我要从子列表中选择的元素根据包含在单独列表中的参数而有所不同。这是一些示例代码来说明我正在尝试做的事情:

# Set seed for replicable results
set.seed(123)

# Create list of lists populated with randomly generated numbers
list1 <- list()
for (i in 1:10) {
  list1[[i]] <- as.list(sample.int(20,10))
}

# Create second randomly generated list
list2 <- as.list(sample.int(10,10))

# For loop with uses values from list 2 to call specific elements from sub-lists within list1
for (i in 1:10){
  print(list1[[i]][[list2[[i]]]])
}

####################################################################################

[1] 4
[1] 8
[1] 5
[1] 8
[1] 15
[1] 17
[1] 12
[1] 15
[1] 3
[1] 15

如您所见,我可以使用for循环使用list1的值与迭代值list2的组合,成功地从嵌套在i的子列表中选择元素。 针对此类问题(R apply function with multiple parameters)的解决方案表明,我应该能够使用mapply函数获得相同的结果。但是,当我尝试执行此操作时,出现以下错误

# Attempt to replicate output using mapply
mapply(function(x,y,z) x <- x[[z]][[y[[z]]]],x=list1,y=list2,z=1:10 )

####################################################################################

Error in x[[z]][[y[[z]]]] : subscript out of bounds

我的问题是:

  1. 如何更改我的代码以实现所需的结果?

  2. 是什么原因导致此错误?过去,当我试图在一个向量旁边输入一个或多个列表时,我在mapply上也遇到了类似的问题,却始终无法弄清为什么有时会失败。

非常感谢!

解决方法

尝试一下。最好使用一个函数来捕获所需的值。出现错误的原因是因为使用索引时函数的工作方式不同。最好直接在*apply()草图内设置函数以达到所需的结果。这里的代码:

#Code
unlist(mapply(function(x,y) x[y],x=list1,y=list2))

输出:

[1]  4  8  5  8 15 17 12 15  3 15

或者如果要在列表中输出:

#Code 2
List <- mapply(function(x,y=list2)

输出:

List
[[1]]
[1] 4

[[2]]
[1] 8

[[3]]
[1] 5

[[4]]
[1] 8

[[5]]
[1] 15

[[6]]
[1] 17

[[7]]
[1] 12

[[8]]
[1] 15

[[9]]
[1] 3

[[10]]
[1] 15

另一个简化的选项可以是(非常感谢,并感谢您归功于 @ 27ϕ9 ):

#Code3
mapply(`[[`,list1,list2)

输出:

[1]  4  8  5  8 15 17 12 15  3 15

或者:

#Code4
mapply(`[`,list2)

输出:

[[1]]
[1] 4

[[2]]
[1] 8

[[3]]
[1] 5

[[4]]
[1] 8

[[5]]
[1] 15

[[6]]
[1] 17

[[7]]
[1] 12

[[8]]
[1] 15

[[9]]
[1] 3

[[10]]
[1] 15
,

如果您查看for循环,则只有一个变量在变化,即i。因此,在这种情况下,您可以使用lapply甚至sapply,因为您会得到一个单一的数字。

sapply(1:10,function(i) list1[[i]][[list2[[i]]]])
#[1]  4  8  5  8 15 17 12 15  3 15

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