LINQでクロス集計表の作成
データの集計を目的に使われるクロス集計を、DataTableに対するLINQで書いてみます。
EXCELでも簡単にできると思いますが、私はやりたくないです。
やってみよう
DataTableに入っているデータをcolumn1, column2という2軸でクロス集計しています。
var query = from table
in dataTable.AsEnumerable()
group table by new { column1 = table[column1], column2 = table[column2] }
into groupby
//orderby hogepiyo
select new
{
groupby.Key.column1
,groupby.Key.column2
,frequency = groupby.Count()
};
並び替え
orderby句をLINQの中に入れるとなぜかうまくいかなかったので、
集計結果にメソッド記法でソートを実施
query.OrderBy(x => x.column1).ThenBy(x => x.column2);
//orderby hogepiyoの部分に
orderby groupby.Key.column1.ToString(),groupby.Key.column2.ToString()
と書くと動きそうですがなぜかダメでした。
正しい書き方わかる人いたら教えてください。
追記1
このクエリではgroupby句に引っかかる箇所しかとれないので、厳密にクロス集計表を作るなら引っかからなかった箇所は0で埋める必要があります。
追記2
chocolamintさんにコメントで指摘いただいたのですが、
上記のクエリだと辞書順ソートになってしまいます。
(OrderByメソッドも同様です。ごめんなさい;;)
正しくは、tableへのアクセスで
table.Field<int>(column1)
として数値として取得する必要があります。
var query = from table
in dataTable.AsEnumerable()
group table by new { column1 = table.Field<int>(column1), column2 = table.Field<int>(column2) }
into groupby
orderby groupby.Key.column1, groupby.Key.column2
select new
{
groupby.Key.column1
,groupby.Key.column2
,frequency = groupby.Count()
};
Author And Source
この問題について(LINQでクロス集計表の作成), 我々は、より多くの情報をここで見つけました https://qiita.com/geppegeppe/items/29094795c700b803616f著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .