R:将函数应用于嵌套列表

R:将函数应用于嵌套列表,r,list,loops,lapply,haversine,R,List,Loops,Lapply,Haversine,我有带数字值的嵌套列表。在我的例子中,它们是经度和纬度,排序如下: list1 <- list(1:50, 1:25, 1:30) list2 <- list(1:50, 1:25) list3 <- list(1:30) list4 <- list(1:50, 1:25, 1:30, 1:45) nested_lons1 <- list(list1, list2, list3, list4) nested_lons2 <- list(list1, list

我有带数字值的嵌套列表。在我的例子中,它们是经度和纬度,排序如下:

list1 <- list(1:50, 1:25, 1:30)
list2 <- list(1:50, 1:25)
list3 <- list(1:30)
list4 <- list(1:50, 1:25, 1:30, 1:45)
nested_lons1 <- list(list1, list2, list3, list4) 
nested_lons2 <- list(list1, list2, list3, list4) 
nested_lats1 <- list(list1, list2, list3, list4) 
nested_lats2 <- list(list1, list2, list3, list4)

list1如果您的列表结构与示例中的列表结构相匹配,则
取消列表
然后
重新列表
数据可能会更简单。首先
unlist
lon/lat数据和
cbind
生成两列矩阵:

library(geosphere)
p1 <- cbind(unlist(nested_lons1), unlist(nested_lats1))
p2 <- cbind(unlist(nested_lons2), unlist(nested_lats2))
库(geosphere)

p1来自
Distaversine
文档:“点的经度/纬度。可以是两个数字的向量、两列矩阵(第一列是经度,第二列是纬度)或空间点*对象”,而
嵌套的lons1[x]
嵌套的lats1[x]
是列表。请注意,例如:
nested_lons1[[1]][[1]]
是实际向量,
1:50
@SteveM您的意思是,对于列表列表,我必须使用实际向量,如[[x][[x]]?我没有使用该函数。在
嵌套的克隆[1]
嵌套的克隆[[1]]
嵌套的克隆[[1]][1]
嵌套的克隆[[1]][[1]]]]
上执行
str
以比较列表的维护方式。。建议您在
lappy
之外尝试单个
distHaversine
函数计算,看看哪个列表调用可以工作。@SteveM看来嵌套的函数[[1][[1]][1]可以工作!它是唯一一个从嵌套列表中访问正确元素的。但我如何将其重新定义为循环呢?我需要在lapply中使用三个索引吗?如果是这样,我如何编写函数?谢谢!我试过你的方法,但从d12开始,对不起。我已经更正了代码。我无意中包含了一行来自先前尝试的内容。现在可以了,非常感谢!即使使用更多嵌套列表,它也能按预期工作。关于这一行,我还有一个问题:d12.lst是的。所有列表必须具有相同的结构,以便其中任何一个都可以工作。函数只是复制列表的结构,而不是数据。
library(geosphere)
p1 <- cbind(unlist(nested_lons1), unlist(nested_lats1))
p2 <- cbind(unlist(nested_lons2), unlist(nested_lats2))
d12 <- distHaversine(p1, p2)
d12.lst <- relist(d12, nested_lons1)
str(d12.lst)
# List of 4
#  $ :List of 3
#   ..$ : num [1:50] 0 0 0 0 0 0 0 0 0 0 ...
#   ..$ : num [1:25] 0 0 0 0 0 0 0 0 0 0 ...
#   ..$ : num [1:30] 0 0 0 0 0 0 0 0 0 0 ...
#  $ :List of 2
#   ..$ : num [1:50] 0 0 0 0 0 0 0 0 0 0 ...
#   ..$ : num [1:25] 0 0 0 0 0 0 0 0 0 0 ...
#  $ :List of 1
#   ..$ : num [1:30] 0 0 0 0 0 0 0 0 0 0 ...
#  $ :List of 4
#   ..$ : num [1:50] 0 0 0 0 0 0 0 0 0 0 ...
#   ..$ : num [1:25] 0 0 0 0 0 0 0 0 0 0 ...
#   ..$ : num [1:30] 0 0 0 0 0 0 0 0 0 0 ...
#   ..$ : num [1:45] 0 0 0 0 0 0 0 0 0 0 ...