いろいろ倉庫

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

【R】複数項目含まれている列をうまいこと分けたい

・お題:データフレームを入手したところ、ある列の項目が一つの場合だけではなく、複数の項目をカンマで区切って繋げている場合があった。行を複製して要素をばらけさせたい。

 

・何かのライブラリの関数でスパッとうまくような気もするが、該当するライブラリがすぐ見つからなかったので、こねくり回してやってみた。

・データセットを作る。

> library(tidyverse)
> df_test <-
+   data.frame(test_ids = c("A1", "B2", "C3","D4"),
+              Name = c("tanaka", "sato,suzuki", "yamada", "yamaguchi,tasaki,fujioka"))
> df_test

・Nameの列が、1名のこともあれば、2名3名をカンマでくっつけていることもある。これをばらけさせたい。

・行を複製することを考える。その前に、複製する行数を算出する。

> df_test <-
+   df_test %>%
+   rowwise(.) %>% 
+   mutate(.,
+          Single =
+            strsplit(Name, ",") %>%
+            unlist(.) %>% 
+            length(.)
+          )
> df_test

・複製した後の名前のベクトルを作っておく。

> Single <-
+   df_test$Name %>% 
+   paste0(., collapse = ",") %>% 
+   strsplit(., ",") %>% 
+   unlist(.)
> Single

 

・複製する。

> library(reshape)
> df_test <-
+   df_test %>% 
+   untable(., num = .$Single)
> df_test

・複製後に先に作成した名前のベクトルを放り込む。どちらかというとName列に放り込むのが筋なのだけれど、Before Afterの比較のためにSingle列に入れてみる。

> df_test$Single <- Single
> df_test

 

・絶対にもっと良いやり方があるはず。。。

 

おわり