julia でデータフレーム中の文字列の種類を数える (累積度数; R の table())
2つの方法で記載します。
- DataFrame で示したいとき: by() と nrow というのを使う
- 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因子以上での統計が必要な方は、検索してみて下さい。