いろいろ倉庫

KNIME、EXCEL、R、Pythonなどの備忘録

【R】リストを潰したい

・お題:所用でリストをまっ平に潰したかったので、メモする。

 

・例えば、ベクトルに名前を付けたり外したりしてみる。

> v1 <- c(1,2,3,4,5)
> v1
[1] 1 2 3 4 5
> names(v1) <- c("A","B","C","D","E")
> v1
A B C D E 
1 2 3 4 5 
> v1 <- unname(v1)
> v1
[1] 1 2 3 4 5

 

・次に、リストを作ってみる。

> lis1 <- list(c(1,2,3))
> lis1
[ [1] ]
[1] 1 2 3

・この[ [1] ]は何だろうかと思ったら、どうも名前っぽい。正式な名称は知らないが、住所を名前替わりにしているらしい。歪に名前を付けると、ちょっとかわいそうな感じになる。

> lis2 <- list(A = c(1,2,3), c(4,5,6))
> lis2
$A
[1] 1 2 3

[ [2] ]
[1] 4 5 6

 

・このリストを潰すには、unlist関数を使う。ちなみに、潰すとベクトルになった。

> unlist(lis1)
[1] 1 2 3

> is.vector(unlist(lis1))
[1] TRUE

・名前つきのリストを潰すと、名前付きのベクトルになる。ちなみに、ベクトルにした後の名前は一意になるらしく、勝手に附番された。

> lis3 <- list(A = c(1,2,3),
+              B = c(4,5),
+              C = c(6,7,8,9))
> lis3
$A
[1] 1 2 3

$B
[1] 4 5

$C
[1] 6 7 8 9


> unlist(lis3)
A1 A2 A3 B1 B2 C1 C2 C3 C4 
 1  2  3  4  5  6  7  8  9 

 

・名前を除くには、unname関数を使う。これでただのベクトルになる。

> unlist(unname(lis3))
[1] 1 2 3 4 5 6 7 8 9

 

・数字を文字にしたい場合、as.character関数を使う。

> as.character(unname(unlist(lis3)))
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9"

 

入れ子が見苦しいので、パイプ演算子を使う。

> library(tidyverse)
> v_ch <-
+   lis3 %>%
+   unlist(.) %>% 
+   unname(.) %>% 
+   as.character(.)
> v_ch
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9"

 

・ちなみに、list関数とas.list関数は挙動が違うみたい。listの方は与えられたオブジェクトを一つの要素と捉えて格納するっぽいけど、as.listはベクトルの要素を粉砕してそれぞれ別建てにしてくれるっぽい(用語が不適切だったらごめんなさい)。

> list(v_ch)
[ [1] ]
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9"

> as.list(v_ch) 
[ [1] ]
[1] "1"

[ [2] ]
[1] "2"

中略

[ [8] ]
[1] "8"

[ [9] ]
[1] "9"

 

・どんな時に使うか分からないけれど、リストをベクトル化した後に自動附番された名前を使って、リストを作り直すこともできる。

> lis4 <- as.list( v_ch )
> names( lis4 ) <- names( unlist( lis3 ) )
> lis4
$A1
[1] "1"

$A2
[1] "2"

$A3
[1] "3"

$B1
[1] "4"

後略

 

おわり