2

我有两个矩阵,纬度和经度,它们都是 50 列 x 100 万(例如)行。我需要创建一个包含 100 万个小标题的列表,每个 2 列(经度和纬度)和 50 行。我目前的代码是:

lonlat <- list()
for (i in 1:nrow(lon)) {
  lonlat[[i]] <- tibble(lon = lon[i, ], lat = lat[i, ])
    }

我知道这是非常低效的,但我无法理解如何使用purrr. 我觉得map2可能是答案,但我怀疑我没有以正确的方式思考这个问题,可能我应该重新组织输入矩阵以使其成为一项更简单的任务。

有人对purrr/map2或此类问题有任何经验吗?提前感谢您的任何想法。

4

2 回答 2

4

您的“50 列”在这里是 5;您的“100 万行”在这里是 4。

lat <- matrix(1:20, nr=4)
lon <- matrix(50 + 1:20, nr=4)
lat
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    1    5    9   13   17
# [2,]    2    6   10   14   18
# [3,]    3    7   11   15   19
# [4,]    4    8   12   16   20
lon
#      [,1] [,2] [,3] [,4] [,5]
# [1,]   51   55   59   63   67
# [2,]   52   56   60   64   68
# [3,]   53   57   61   65   69
# [4,]   54   58   62   66   70

您的 100 万长列表在这里有 4 长,每列有 2 列和 5 行。

Map(tibble, lat=asplit(lat, 1), lon=asplit(lon, 1))
# [[1]]
# # A tibble: 5 x 2
#     lat   lon
#   <int> <dbl>
# 1     1    51
# 2     5    55
# 3     9    59
# 4    13    63
# 5    17    67
# [[2]]
# # A tibble: 5 x 2
#     lat   lon
#   <int> <dbl>
# 1     2    52
# 2     6    56
# 3    10    60
# 4    14    64
# 5    18    68
# [[3]]
# # A tibble: 5 x 2
#     lat   lon
#   <int> <dbl>
# 1     3    53
# 2     7    57
# 3    11    61
# 4    15    65
# 5    19    69
# [[4]]
# # A tibble: 5 x 2
#     lat   lon
#   <int> <dbl>
# 1     4    54
# 2     8    58
# 3    12    62
# 4    16    66
# 5    20    70

如果你真的想用purrr,那么

purrr::map2(asplit(lat, 1), asplit(lon, 1), ~ tibble(lat=.x, lon=.y))
于 2022-03-01T18:57:08.870 回答
2

这是一个使用asplit+的选项(从@r2evansarray借用数据)

> asplit(array(cbind(lat, lon), c(dim(lat), 2)), 1)
[[1]]
     [,1] [,2]
[1,]    1   51
[2,]    5   55
[3,]    9   59
[4,]   13   63
[5,]   17   67

[[2]]
     [,1] [,2]
[1,]    2   52
[2,]    6   56
[3,]   10   60
[4,]   14   64
[5,]   18   68

[[3]]
     [,1] [,2]
[1,]    3   53
[2,]    7   57
[3,]   11   61
[4,]   15   65
[5,]   19   69

[[4]]
     [,1] [,2]
[1,]    4   54
[2,]    8   58
[3,]   12   62
[4,]   16   66
[5,]   20   70
于 2022-03-01T19:30:26.750 回答