R:将函数应用于嵌套列表
R: Apply function to nested lists
我有带数值值的嵌套列表。在我的例子中,它们是这样排序的经度和纬度:
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)
随机数仅供说明之用。
我想使用 Haversine 公式计算每个嵌套列表(list1 到 list4)的两点之间的距离。我读到最好避免 for 循环,这就是我查看 lapply.
的原因
dist <- lapply(1:4, function(x) distHaversine(c(nested_lons1[x],nested_lats1[x]),
c(nested_lons2[x],nested_lats2[x]), r = 6371))
这会产生类似“无法转换为双精度”的错误。我认为索引也是错误的,因为函数应该遍历第一个列表的嵌套列表,然后转到第二个列表中的嵌套列表,依此类推,直到第 4 个。我怎样才能做到这一点?还有其他(更好的)方法吗?谢谢!
如果您的列表结构匹配,就像它们在您的示例中所做的那样,则 unlist
然后 relist
数据可能更简单。首先 unlist
lon/lat 数据和 cbind
制作 2 列矩阵:
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 ...
当然,这只适用于四个嵌套列表具有相同结构的情况。
我有带数值值的嵌套列表。在我的例子中,它们是这样排序的经度和纬度:
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)
随机数仅供说明之用。 我想使用 Haversine 公式计算每个嵌套列表(list1 到 list4)的两点之间的距离。我读到最好避免 for 循环,这就是我查看 lapply.
的原因dist <- lapply(1:4, function(x) distHaversine(c(nested_lons1[x],nested_lats1[x]),
c(nested_lons2[x],nested_lats2[x]), r = 6371))
这会产生类似“无法转换为双精度”的错误。我认为索引也是错误的,因为函数应该遍历第一个列表的嵌套列表,然后转到第二个列表中的嵌套列表,依此类推,直到第 4 个。我怎样才能做到这一点?还有其他(更好的)方法吗?谢谢!
如果您的列表结构匹配,就像它们在您的示例中所做的那样,则 unlist
然后 relist
数据可能更简单。首先 unlist
lon/lat 数据和 cbind
制作 2 列矩阵:
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 ...
当然,这只适用于四个嵌套列表具有相同结构的情况。