Функции zip/unzip в R
Я ищу такие функции, как zip/unzip в функциональных языках программирования (например, Haskell, Scala).
Примеры из ссылки на Haskell. Почтовый индекс:
Input: zip [1,2,3] [9,8,7]
Output: [(1,9),(2,8),(3,7)]
Распакуйте:
Input: unzip [(1,2),(2,3),(3,4)]
Output: ([1,2,3],[2,3,4])
В R вход будет выглядеть примерно так. Для архивирования:
l1 <- list(1,2,3)
l2 <- list(9,8,7)
l <- Map(c, l1, l2)
Для распаковки:
tuple1 <- list(1,2)
tuple2 <- list(2,3)
tuple3 <- list(3,4)
l <- Map(c, tuple1, tuple2, tuple3)
Есть ли встроенное решение / библиотека в R, которая реализует эти методы? (Функции FP, как правило, имеют довольно много имен - поиск по zip/unzip & R только дал мне результаты для сжатия / распаковки файлов.)
2 ответа
Пакет purrr пытается предоставить множество FP-примитивов. purrr
зип версия называется transpose()
,
L1 <- list(as.list(1:3),as.list(9:7))
library(purrr)
(L2 <- transpose(L1))
## List of 3
## $ :List of 2
## ..$ : int 1
## ..$ : int 9
## $ :List of 2
## ..$ : int 2
## ..$ : int 8
## $ :List of 2
## ..$ : int 3
## ..$ : int 7
identical(transpose(L2),L1) ## TRUE
transpose()
также работает на вашем втором (распаковать) пример.
Я не думаю, что это именно то, что вам нужно, но если его векторы равной длины, вы можете соответствовать массиву, а затем использовать разбиение для любого направления:
l <- list(c(1, 9), c(2, 8), c(3, 7))
m <- do.call(rbind, l)
split(m, row(m))
split(m, col(m))
## > split(m, row(m))
## $`1`
## [1] 1 9
##
## $`2`
## [1] 2 8
##
## $`3`
## [1] 3 7
## > split(m, col(m))
## $`1`
## [1] 1 2 3
##
## $`2`
## [1] 9 8 7