Chapter 10 DataFrame
##作成
DataFrame の作成には DataFrame::create() を使用します。また、 DataFrame の作成時にカラム名を指定する場合には、Named("名前") または _["名前"] を使用します。
// Vector v1, v2 から DataFrame df を作成します
DataFrame df = DataFrame::create(v1, v2);
//列に名前をつける場合
DataFrame df = DataFrame::create(Named("V1") = v1 , _["V2"]=v2);DataFrame::create() で DataFrame を作成すると、カラムには元の Vector の要素の値が複製されるのではなく、元の Vector への「参照」となります。そのため、元の Vector の値を変更すると DataFrame の値も変更されます。そうならないように Vector の要素の値を複製してDataFrame のカラムを作成する場合には clone() 関数を使います。
clone() 関数を使った場合と使わなかった場合の違いを見るために、下のコード例を見てください。コード例では、Vector v からDataFrame df を作成しています。そこでは、カラム V1 は v への参照、カラム V2 は clone() 関数により v の値を複製しています。その後、Vector v に変更操作を行うと、データフレーム df のカラム V1 は変更されていますが、V2 は影響を受けないことがわかります。
// [[Rcpp::export]]
DataFrame rcpp_df(){
// ベクトル v を作成します
NumericVector v = {1,2};
// データフレムを作成します
DataFrame df = DataFrame::create( Named("V1") = v,
Named("V2") = clone(v));
// ベクトル v を変更します
v = v*2;
return df;
}実行結果
> rcpp_df()
V1 V2
1 2 1
2 4 2
##要素へのアクセス
DataFrame の特定のカラムにアクセスする場合には、カラムを一旦 Vector に代入し、そのVector を介してアクセスします。ベクトルの要素の指定の場合と同様に、DataFrame のカラムは、数値ベクトル(カラム番号)、文字列ベクトル(カラム名)、論理値ベクトルにより指定できます。
NumericVector v1 = df[0];
NumericVector v2 = df["V2"];
DataFrame 作成の時と同様に、上の方法で Vector に DataFrame のカラムを代入すると、Vector には カラムの値がコピーされるのではなく、カラムへの「参照」となります。そのため、Vector へ変更操作を行うと、df のカラムの内容も変更されます。
元の DataFrame の値が変更されないようにカラムの値コピーして Vector を作成たい場合には clone() 関数を用います。
NumericVector v1 = df[0]; // v1 は dfの 0 列目への「参照」となります
v1 = v1*2; // v1 の値を変更すると df[0] の値も変更されます
NumericVector v2 = clone(df[0]); // v2 には df[0] の要素の値を複製します
v2 = v2*2; // v2 を変更しても df[0] の値は変わりません
##メンバ関数
Rcpp では、DataFrame や List は、ある種のベクトルとして実装されています。つまり、Vector は、スカラー値を要素とするベクトル、DataFrame は同じ長さの Vector を要素とするベクトルです。そのため、DataFrame は Vector 共通するメンバ関数を多く持っています。
10.0.1 length() size()
列数を返します。
###nrows()
行数を返します。
###names()
カラム名を文字列ベクトルで返します。
###offset(name) findName(name)
文字列 name で指定された名前のカラムの列番号を返します。
###findName(name)
文字列 name で指定された名前のカラムの列番号を返します。
###fill(v)
この DataFrame の全てのカラムを Vector v で満たします。
###assign( first_it, last_it)
イテレーター first_it, last_it で指定された範囲のカラムを、この DataFrame に代入します。
###push_back(v)
この DataFrame の末尾に Vector v を追加します。
###push_back( v, name )
この DataFrame の末尾に Vector v を追加します。 追加したカラムの名前を文字列 name で指定します。
###push_front(x)
この DataFrame の先頭に Vector v を追加します。
###push_front( x, name )
この DataFrame の先頭に Vector v を追加します。追加したカラムの名前を文字列 name で指定します。
10.0.2 begin()
この DataFrame の先頭カラムへのイテレータを返します。
10.0.3 end()
この DataFrame の末尾へのイテレータを返します。
10.0.4 insert( it, v )
この DataFrame の、イテレータ it で示された位置に`Vector ` v を追加し、その要素へのイテレータを返します。
10.0.5 erase(i)
この DataFrame の i 番目のカラムを削除し、削除した直後のカラムへのイテレータを返す。
###erase(it)
イテレータ it で指定されたカラムを削除し、削除した直後のカラムへのイテレータを返します。
###erase(first_i, last_i)
first_i 番目 から last_i -1 番目 までのカラムを削除し、削除した直後のカラムへのイテレータを返します。
10.0.6 erase(first_it, last_it)
イテレータ first_it から last_it -1 で指定されるカラムまでを削除し、削除した直後のカラムへのイテレータを返します。
10.0.7 containsElementNamed(name)
この DataFrame が文字列 name で指定された名前のカラムを持っている場合には true を返します。
10.0.8 inherits(str)
このオブジェクトの属性 class に文字列 str が含まれているかどうか。