julia でデータフレーム中の文字列の種類を数える (累積度数; R の table())

julia でデータフレーム中の文字列の種類を数える、つまり、文字列毎の累積度数を求める方法です。これは、R では、table() に相当する方法についてです。

2つの方法で記載します。

  1. DataFrame で示したいとき: by() と nrow というのを使う
  2. dictionary で取り出したいとき: StatBase パッケージの countmap() を使う

1. by() と nrow を使う

DataFrames パッケージに標準で付いているところの by を使ってみましょう。row の数を "nrow" として数えてもらいます。

例によって、R の iris で例示します。

julia> Pkg.add("StatsBase")
julia> using RDatasets
julia> iris = dataset("datasets", "iris")
julia> by(iris, :Species, nrow)
3×2 DataFrames.DataFrame
│ Row │ Species      │ x1 │
├─────┼──────────────┼────┤
│ 1   │ "setosa"     │ 50 │
│ 2   │ "versicolor" │ 50 │
│ 3   │ "virginica"  │ 50 │

オマケ: by() の3つ目のところを "iris -> mean(iris[:PetalWidth]) とすると、Species ごとの PetalWidth の平均を示してくれます。

julia> by(iris, :Species, iris ->mean(iris[:PetalWidth]))
3×2 DataFrames.DataFrame
│ Row │ Species      │ x1    │
├─────┼──────────────┼───────┤
│ 1   │ "setosa"     │ 0.246 │
│ 2   │ "versicolor" │ 1.326 │
│ 3   │ "virginica"  │ 2.026 │

これも便利そうですね。ただし、1つずつしか集計できないみたいです。たくさんするときは、aggregate() の方が便利でしょう。

2. StatBase パッケージの countmap() を使う

StatsBase パッケージの中に、countmap() という命令があります。 未インストールなら、インストールして下さい。

julia> Pkg.add("RDatasets")

例によって、R の iris で例示します。

julia> using StatsBase
julia> using RDatasets
julia> iris = dataset("datasets", "iris")
150×5 DataFrames.DataFrame
│ Row │ SepalLength │ SepalWidth │ PetalLength │ PetalWidth │ Species     │
├─────┼─────────────┼────────────┼─────────────┼────────────┼─────────────┤
│ 1   │ 5.1         │ 3.5        │ 1.4         │ 0.2        │ "setosa"    │
│ 2   │ 4.9         │ 3.0        │ 1.4         │ 0.2        │ "setosa"    │
│ 3   │ 4.7         │ 3.2        │ 1.3         │ 0.2        │ "setosa"    │
│ 4   │ 4.6         │ 3.1        │ 1.5         │ 0.2        │ "setosa"    │
│ 5   │ 5.0         │ 3.6        │ 1.4         │ 0.2        │ "setosa"    │
│ 6   │ 5.4         │ 3.9        │ 1.7         │ 0.4        │ "setosa"    │
│ 7   │ 4.6         │ 3.4        │ 1.4         │ 0.3        │ "setosa"    │
略

julia> countmap(iris[:Species])
Dict{Union{DataArrays.NAtype,String},Int64} with 3 entries:
"virginica" => 50
"setosa" => 50
"versicolor" => 50

FreqTables という、もう少し高級なパッケージ もあるので、2因子以上での統計が必要な方は、検索してみて下さい。

B! LINE