2016-11-29 10 views
4

関数型プログラミング言語(例:Haskell、Scala)でzip/unzipのような関数を探しています。Zip/unzip functions in R

Examples from the Haskell reference。郵便番号:

Input: zip [1,2,3] [9,8,7] 
Output: [(1,9),(2,8),(3,7)] 

解凍:Rで

Input: unzip [(1,2),(2,3),(3,4)] 
Output: ([1,2,3],[2,3,4]) 

、入力は次のようになります。

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

'地図(C、L1、 l2) 'と' Map(c、tuple1、tuple2、tuple3) 'あなたのRの例はちょっと混乱しています。 – thelatemail

+0

@thelatemailありがとう、私はそれに応じて質問を更新しました。 –

+0

さて、私はあなたがそれに満足しているなら、答えは 'Map'関数だと思います。以下の質問に答えてください。 – thelatemail

答えて

2

purrr packageは多くのFPプリミティブを提供しようとします。 purrrのzipバージョンは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()は、2番目の(解凍)例でも動作します。

+0

ニースはこれを1か月前のビデオで見ましたが、それが入っていたパッケージを覚えていませんでした。+1 –

+0

質問が正しく分かっていれば、 '%%>%transpose()%>%simplify_all()' – alistaire

1

私は、これはあなたが後にしている正確に何であるとは思わないが、それはあなたが、配列に準拠して、どちらかの方向のためのスプリットを使用することができ、同じ長さのベクトルだ場合:

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