R 将 2 个矩阵转置为 tibbles 列表(对于嵌套 df)
R transpose 2 matrices into a list of tibbles (for a nested df)
我有两个矩阵,纬度和经度,都是 50 列 x 100 万(例如)行。我需要创建一个包含 100 万个 tibbles 的列表,每个 2 列 - lon 和 lat - 和 50 行。我当前的代码是:
lonlat <- list()
for (i in 1:nrow(lon)) {
lonlat[[i]] <- tibble(lon = lon[i, ], lat = lat[i, ])
}
我知道这非常低效,但我无法理解如何使用 purrr
来做到这一点。我觉得 map2
可能是答案,但我怀疑我没有以正确的方式思考这个问题,也许我应该重新组织输入矩阵以使其成为一项更简单的任务。
有人遇到过purrr
/map2
或这类问题吗?提前感谢您的任何想法。
您的“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
这里你的 1-million-long 列表是 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))
这里有一个使用asplit
+ array
的选项(从借用数据)
> 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
我有两个矩阵,纬度和经度,都是 50 列 x 100 万(例如)行。我需要创建一个包含 100 万个 tibbles 的列表,每个 2 列 - lon 和 lat - 和 50 行。我当前的代码是:
lonlat <- list()
for (i in 1:nrow(lon)) {
lonlat[[i]] <- tibble(lon = lon[i, ], lat = lat[i, ])
}
我知道这非常低效,但我无法理解如何使用 purrr
来做到这一点。我觉得 map2
可能是答案,但我怀疑我没有以正确的方式思考这个问题,也许我应该重新组织输入矩阵以使其成为一项更简单的任务。
有人遇到过purrr
/map2
或这类问题吗?提前感谢您的任何想法。
您的“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
这里你的 1-million-long 列表是 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))
这里有一个使用asplit
+ array
的选项(从
> 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