データフレーム

行列型のデータはデータフレームで管理した方が便利な場合がある。Julia でデータフレーム型を扱うには DataFrames パッケージを読み込む必要がある。

using DataFrames

データファイルの読み込み

DataFrames パッケージ中の readtable 関数にオプション separator = '\t' を付けて利用してタブ区切りのテキストデータを読み込むことができる。例えば、count2g.txt を読み込む場合は以下のようにする。(separator = "\t" とした場合は正しく動作しない。)

dat = readtable("count2g.txt", separator = '\t')
head(dat)
## 6x7 DataFrame
## | Row | GeneID   | A1  | A2  | A3  | B1  | B2 | B3 |
## |-----|----------|-----|-----|-----|-----|----|----|
## | 1   | "gene_1" | 3   | 2   | 40  | 4   | 2  | 0  |
## | 2   | "gene_2" | 680 | 807 | 594 | 165 | 91 | 73 |
## | 3   | "gene_3" | 35  | 38  | 31  | 7   | 9  | 11 |
## | 4   | "gene_4" | 103 | 165 | 110 | 38  | 31 | 28 |
## | 5   | "gene_5" | 2   | 9   | 1   | 3   | 1  | 0  |
## | 6   | "gene_6" | 419 | 373 | 399 | 133 | 89 | 58 |

tail(dat)
## 6x7 DataFrame
## | Row | GeneID      | A1  | A2 | A3 | B1  | B2  | B3  |
## |-----|-------------|-----|----|----|-----|-----|-----|
## | 1   | "gene_995"  | 0   | 0  | 0  | 0   | 0   | 0   |
## | 2   | "gene_996"  | 136 | 89 | 90 | 86  | 127 | 128 |
## | 3   | "gene_997"  | 6   | 14 | 20 | 12  | 28  | 9   |
## | 4   | "gene_998"  | 19  | 11 | 38 | 17  | 15  | 16  |
## | 5   | "gene_999"  | 0   | 4  | 48 | 16  | 9   | 8   |
## | 6   | "gene_1000" | 26  | 70 | 88 | 101 | 75  | 147 |

データファイルの書き出し

データフレーム型のデータをファイルに書き出して保存する場合は writetale 関数を利用する。

writetable("mydata.txt", dat, separator = '\t')

データフレームの操作

データフレームの列名を取得するときは names 関数を利用する。

names(dat)
## 7-element Array{Symbol,1}:
##  :GeneID
##  :A1
##  :A2
##  :A3
##  :B1
##  :B2
##  :B3

データフレームの列数および行数は次のように求めることができる。

length(dat)
## 7

size(dat)
## (1000,7)

データフレームの中から一部のデータを取り出す際に、行列と同じ操作で行うことができる。

dat[10:15, 2:6]
## 6x5 DataFrame
## | Row | A1  | A2  | A3  | B1  | B2  |
## |-----|-----|-----|-----|-----|-----|
## | 1   | 383 | 362 | 289 | 78  | 107 |
## | 2   | 680 | 237 | 300 | 65  | 53  |
## | 3   | 35  | 30  | 7   | 8   | 1   |
## | 4   | 216 | 182 | 297 | 24  | 45  |
## | 5   | 527 | 475 | 446 | 201 | 150 |
## | 6   | 9   | 11  | 13  | 0   | 1   |

列名や行名を指定して取り出すこともできる。

dat[1:5, [:A1, :B2]]
## 5x2 DataFrame
## | Row | A1  | B2 |
## |-----|-----|----|
## | 1   | 3   | 2  |
## | 2   | 680 | 91 |
## | 3   | 35  | 9  |
## | 4   | 103 | 31 |
## | 5   | 2   | 1  |

B1 列が A1 列より大きい行を取り出す例。

head(dat[dat[:A1] .< dat[:B1], :])
## 6x7 DataFrame
## | Row | GeneID    | A1 | A2  | A3 | B1 | B2 | B3 |
## |-----|-----------|----|-----|----|----|----|----|
## | 1   | "gene_1"  | 3  | 2   | 40 | 4  | 2  | 0  |
## | 2   | "gene_5"  | 2  | 9   | 1  | 3  | 1  | 0  |
## | 3   | "gene_20" | 32 | 115 | 86 | 51 | 53 | 56 |
## | 4   | "gene_27" | 12 | 2   | 54 | 29 | 4  | 11 |
## | 5   | "gene_29" | 9  | 12  | 45 | 14 | 8  | 7  |
## | 6   | "gene_42" | 2  | 8   | 1  | 27 | 4  | 3  |

各列に対してなんらかの関数処理を適用したい場合は colwise 関数を利用する。R の apply(x, 2) に似ている。

colwise(mean, dat[:, 2:7])
## 6-element Array{Any,1}:
##  [127.648]
##  [118.844]
##  [121.144]
##  [99.598]
##  [107.968]
##  [105.788]

colwise(sum, dat[:, 2:7])
## 6-element Array{Any,1}:
##  [127648]
##  [118844]
##  [121144]
##  [99598]
##  [107968]
##  [105788]