カテゴリー別アーカイブ: Tips

Rで指数表記 (Scientific Notification)を抑止する

Rで指数表記されるのを抑止するには、変数に対してformat(variable, scientific = FALSE)を実行します。例えば、データフレーム中の特定の変数X1について指数表記を抑止するには以下のようなコードとなります。

df$X1 <- format(df$X1, scirntific = FALSE)

Rと他のプログラム間でデータを移動させるとき、プログラムによっては指数表記を解釈できない場合があります。特にCSVでデータをエクスポートする場合にありえるかと思います。

MySQLの怖い話2

MySQL/MariaDBでテーブルの行数を確認しようとして、以下のようにミスをしてもクエリとしては動作します。ただし、意図した挙動はしませんが。
SELECT COUNT(*) FROM SOME_TABLE;

これは、FROMを忘れたことでSOME_TABLEは列名と解釈されるためです。問題はCOUNT()の方です。列名として解釈されるのは特に不思議には思えず、またFROMも構文上はオプショナルですから問題ありません。わからないのはCOUNT()が何を数えているかです。これについては今のところ回答は出ていません。

Excel PowerQueryでテーブルを結合する

使っているExcelが2010以降でボリュームライセンスのExcelや単独のアプリケーションでの購入や企業用のOffice 365の購読の場合にはPowerBIに含まれるPowerQueryが使用できる。PowerQueryは多様な機能を持っているがテーブルの結合はデータ加工時には多用するため解説する。

テーブル同士を結合するPowerQueryの関数はTable.Joinである。この関数は以下のような文法になっている。
Table.Join(<テーブル1>,<結合に使用する列名1>,<テーブル2>,<結合に使用する列名2>[,<結合の方法>])
結合の方法はJoinKind列挙型で以下のいずれかを取る。

  • TableKind.Inner
  • TableKind.LeftOuter
  • TableKind.RightOuter
  • TableKind.FullOuter
  • TableKind.LeftAnti
  • TableKind.RightAnti

恐らく多用するのは内部結合 TableKind.Inner、外部結合 TableKind.LeftOuterの2つだろう。基本的にはSQLのJoinと変わらないがPowerQueryの場合には当然ながら各種のデータソースを混合して結合できるところにメリットがある。

Rのwrite.csvではcol.namesが使えない

write.tableではcol.namesオプションがあり、変数名を出力せずにアウトプットができます。しかし、write.csvでは明示的にcol.namesオプションが殺されており、col.namesは指定できません。
これは、write.csvのソースコードを確認するとはっきりとします。

function (...) 
{
    Call <- match.call(expand.dots = TRUE)
    for (argname in c("append", "col.names", "sep", "dec", "qmethod")) if (!is.null(Call[[argname]])) 
        warning(gettextf("attempt to set '%s' ignored", argname), 
            domain = NA)
    rn <- eval.parent(Call$row.names)
    Call$append <- NULL
    Call$col.names <- if (is.logical(rn) && !rn) 
        TRUE
    else NA
    Call$sep <- ","
    Call$dec <- "."
    Call$qmethod <- "double"
    Call[[1L]] <- as.name("write.table")
    eval.parent(Call)
}

中を見れば判るとおり、col.namesを使えないようにしています。元々、write.csvはwrite.tableのサブセットであり、いくつかのパラメータを既定値としてセットしたものとしてデザインされています。よって、その範囲外の使い方をするには大本のwrite.tableを使うようになっています。

SQL Serverで週番号を出す

データ加工ではその特性上、週番号がほしいことがあります。特に週単位に集計したい場合には。

SQL ServerではDATEPART関数でwwを指定することで週番号をとることができます。例えば以下のような使い方ができます。

SELECT DATEPART(WW,CONVERT(DATE,'2011/1/7'))

この場合には2週目になりますので、週番号として2が返ってきます。また、週初めとして起算する最初の曜日は以下の形で指定します。

SET DATEFIRST <曜日>

曜日は1~7をとり、7は日曜日となります。また、DATEFIRSTの既定値は7となります。

Windows PowerShellでデータ加工する

このアーティクルは以前、公開したものの改訂版になります。

データを分析する場合、重要な工程にデータ加工があります。データ加工によって分析しやすい形にすることで、身も蓋もありませんが特別な統計的アプローチに凝るよりも精度に良い影響を与えることは少なくありません。一般にデータ加工においてコンパイルの必要な言語を使うことは少なく、またスクリプトによって自動化を進める必要もあります。

Windows PowerShellはADO.NETによるDB接続やDecimalでの演算、正規表現などデータ加工に必要なツールを一通り備えていると考えています。また、Windows Server 2008以降ではWindows PowerShellはWidows OSに標準で含まれているためソフトウェアのインストールに煩雑な手続きが必要な現場でも使えるのではないかという考えもあります。  データ加工で考えられる代表的なタスクを纏めてみます。

ADO.NETを参照する
[System.Reflection.Assembly]::LoadWithPartialName(“System.Data”)
SQL Serverに接続する
$conn = New-Object System.Data.SqlClient.SqlConnection <接続文字列> $conn.Open()
SQL文を実行する
$sqlcmd = $conn.CreateCommand() $sqlcmd.CommandText = “SELECT 1” $r = $sqlcmd.ExecuteScalar()
先頭一文字を取りだす正規表現オブジェクトを生成する
$re = New-Object System.Text.RegularExpressions.Regex “(.)(.*)”
CSVファイルを読みだすためにTextFieldParserを生成する
[System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.VisualBasic”) $tfp = New-Object Microsoft.VisualBasic.FileIO.TextFieldParser <ファイル名>

ちなみに、Windows PowerShellにはコレクションを繰り返す方法にForEach-Objectとforeach文があるが、データ加工にはForEach-Objectの方が適すると思われる。これは、コレクションが展開されてそれを繰り返すかイテレータで逐次取得するかが絡んでいるがこれについてはいずれ検証したい。