いいもんつくったー

WindowsのロケールをUTF-8にしたらlist.files()でファイルが検出できなくなった

ある日のこと。家で書いたR言語のコードを会社のPCでデバックしようとしたら動かない!!!
昨日まで動いてたのに。バージョンも3.6.1で同じなのに。

どんなエラーはいてる?

file(file, "rt") でエラー: コネクションを開くことができません

csvを読み込もうとしているのにそんなもん存在しないよと言われている。

何が悪さしている?

> input1Path <- paste0(inputPath,"あいうえお/")
> folder <- input1Path
> print(list.files(folder))
character(0)

list.files()が悪そうだ。指定のディレクトリにファイルなんてないよと言われている。list.files()が日本語名のファイルを検出してくれないのが問題のようだ。確かにファイルは存在しているのに。
(本当は日本語のパスや日本語名のcsvなんて扱いたくないさ。。)

f:id:Ry87:20200512231811p:plain
error

昨日は動いたのに今日は動かない。じゃあその変化点はなんだ?
そういえば今日会社PCのシステムローケールいじったな。
会社指定の設定で「ワールドワイド言語サポートでUnicode UTF-8を使用」ってやつにチェック入れたな。
(本当はこんなわけもわからない設定にチェックなんていれたかないさ)
howpon.com

f:id:Ry87:20200512232000p:plain
unicode

チェック外してみた。問題なく動いた。
原因こいつか。エンコードが悪さしてたみたい。ちょっと急ぎの件があるので深入りしないが、ひとまずTipsとしてメモ。

いろんなクラスタリング手法を試せるツール作った

クラスタリングと言ってもいろいろな手法がありますが、それぞれ特徴があります。例えば最長距離法はクラスタの大きさが揃いやすいとか、群平均法は外れ値に強いとか。それぞれの特徴については下記が詳しいです。
qiita.com
だがしかし、どのデータでどの手法だとどういう結果になるのか直感的に試してみたくてたまらなくなるのが右脳人間。気軽に試して遊べるツールが欲しい。。。

解決方法

ということで今回は気軽にいろんなクラスタリング手法が試せるツールを作りました。
対応しているクラスタリング手法は下記です。

  • 最近隣法(Single)
  • 最遠隣法(Complete)
  • 群平均法(Average)
  • 重心法(Centroid)
  • メディアン法(Median)
  • ウォード法(ward)
  • McQuitty法(mcquitty)
  • k-means法(k-means)

使い方はこんな感じです。

  1. データ(csv)を読み込む
  2. クラスタリングに用いるパラメータ、クラスタ数、手法を選ぶ
  3. 散布図とデンドログラムで結果確認(※k-means法に関しては非階層なのでデンドログラムは出ません)

世の中には便利なツールがありまして、下記のURLで手書きで群になりそうなダミーデータを生成&出力して、このツールでクラスタリングを試してみるという使い方も面白いと思います。
drawdata.xyz

実行方法

普段Rを使わない方はちょっとだけ前準備が必要です。

  1. Rstudioをインストール
  2. 下記おまじないをRstudioのコンソールに打ち込んで、ライブラリをインストール
install.packages("shiny")
install.packages("DT")
install.packages("ggplot2")
install.packages("cluster")
install.packages("ggdendro")

3.下記おまじないをRstudioのコンソールに打ち込んで、ツールの実行

library(shiny)
runUrl("https://github.com/Ry87/ClusteringTool/archive/master.tar.gz")

自由に使ってみてください~!Enjoy!

複数の列でセル改行されているcsvファイルを行分割するツール作った

度々物議をかもすExcelのセル結合やセル改行。
何度お願いだからセルのマージだけはやめてと言っても辞めてくれないのが人間の性。
挙句の果てにセル結合の解除や改行セルの分割がデータサイエンティストの仕事になってしまったりするのです。

解決方法

そこで今回はセル改行に焦点を当てて、セル改行されているcsvファイルをセル分割するツールを作りました。
(今後なんとかしてセル結合問題も解いていきたいが、仕様決めが結構難しい。。)
使い勝手はこんな感じです。

  1. セル改行されているcsvを読み込む
  2. inputタブで読み込まれたファイル確認
  3. outputタブで改行が分割されたデータを確認
  4. データ出力

使い方

普段Rを使わない方はちょっとだけ前準備が必要です。

  1. Rstudioをインストール
  2. 下記おまじないをRstudioのコンソールに打ち込んで、ライブラリをインストール
install.packages("shiny")
install.packages("DT")
install.packages("tidyverse")

3.下記おまじないをRstudioのコンソールに打ち込んで、ツールの実行

library(shiny)
runUrl("https://github.com/Ry87/SeparateCellsApp/archive/master.tar.gz")

コード

下記に置いてますが、R・Shiny話す方向けにコード解説もしておきます。
github.com

#ライブラリの宣言
library(DT)
library(tidyverse)


shinyServer(function(input, output) {

#ui.Rとの関連付け
  output$input <- DT::renderDataTable(inputData(),selection = list(target='column'))
  output$output <- DT::renderDataTable(outputData(),selection = list(target='column'))
  
#csvデータの読み込み&表示
  inputData <- reactive({if(is.null(input$inputFile)) return(NULL)
    read.csv(input$inputFile$datapath,row.names=1, header = TRUE, sep=",")
  })
  
#セル分割後のデータ表示
  outputData <- reactive({
    GetOutputData()
  })
  
#セル分割後のデータ取得
  GetOutputData <- function(){
    data <- inputData()
    if(is.null(inputData())){return(NULL)}
    mergedCellColumns <- FindMergedCellColumns(data)
    if(is.null(mergedCellColumns)){return(NULL)}
 #セルを分割
    for(col in mergedCellColumns){
      data <- data %>%tidyr::separate_rows(col,sep = "\n")
    }
    return(data)
  }
  
#セル分割されている列名を取得するための関数
  FindMergedCellColumns <- function(data){
 #列データをループして列ごとにセルが分割されているかを取得
    hasMergedCell <- sapply(data, function(x){any(str_detect(x,pattern="\n"))})
    #セル分割されている列の列名を取得
    mergedCellColumns <- names(which(hasMergedCell==TRUE))
    return(mergedCellColumns)
  }
  
#セル分割後のデータ出力
  output$outputExport <- downloadHandler(
    filename = "output.csv",
    content = function(file) {
      write.csv(GetOutputData(), file)
    })
})