第 12 章 数据框

本章主要讲述如何创建一个DataFrame对象,以及如何访问其元素,及其成员函数。在Rcpp中,DataFrame是按照一种向量的方式实施的。换言之,Vector是一种元素为标量的向量,而DataFrame是元素为具有相同长度的Vector的向量。因此,VectorDataFrame在创建对象,访问元素和成员函数上,有很多相同的方法。

12.1 创建数据框对象

DataFrame::create()被用于创建DataFrame对象。使用Named()_[]可以为数据框对象指定列名。

当用户使用DataFrame::create()来创建DataFrame时,原始的Vector元素不会被复制到数据框的列中,该列实际上是对原始Vector的“引用”(“reference”)。因此,改变原始Vector的值,也会改变数据框对应列的值。为了避免上述情况,在创建DataFrame的列时,我们可以使用clone()函数来复制Vector元素的值。

通过下面的代码示例,可以看到使用clone()和不使用之间的区别。数据框df的两列v1v2,分别是对Vector v的引用,以及复制。可以看到,如果改变Vector v,那么 v1会被改变,但是v2不受影响。

执行结果如下:

> rcpp_df()
  V1 V2
1  2  1
2  4  2

12.2 访问数据框元素

当我们想访问DataFrame的某一列时,这一列会被暂时地赋值到Vector对象上,然后通过该对象来访问。与Vector类似,DataFrame的列可以通过一个数值向量(某个列数),一个字符串向量(某个列名),或一个逻辑向量来指定。

DataFrame 的创建类似, 通过上面的方法,给一个DataFrame 列赋到Vector 不会把这个值赋值到 Vector 对象上, 但是会是一个对列的“reference”(引用). 因此,当你改变Vector 对象的值时,该列的值也会被相应地改变。

如果你希望,通过拷贝列值的方式来创建Vector,使用clone()函数,这样原始的DataFrmae列的值不会随着这个Vector的改变而改变。

NumericVector v1 = df[0]; // v1 成为"reference" df 0列的引用
v1 = v1 * 2;              // 改变v1的值,也会导致df[0]的值改变
NumericVector v2 = clone(df[0]); // 将df[0]的值复制给v2
v2 = v2*2;                       // 改变v2的值,不会导致df[0]的值改变

12.3 成员函数

在Rcpp中,DataFrmae是利用某些种类的向量来实现的。换言之,Vector是元素为标量的向量,而DataFrame是元素为Vector的向量。因此,DataFrameVector有着很多共同的成员函数。

12.3.1 length() size()

返回列数。

12.3.2 nrows()

返回行数。

12.3.3 names()

以字符向量的方式返回列名。

12.3.4 offset(name) findName(name)

返回用“name”字符串指定列名的数值索引。

12.3.6 assign( first_it, last_it)

通过迭代器 first_it 和 last_it 指定的范围来给DataFrmae的列赋值。具体可以参考Vector8.3.7章节。

12.3.7 push_back(v)

DataFrame后加入Vectorv.

12.3.8 push_back( v, name )

DataFrame后加入Vectorv,其列名为指定的“name”。

12.3.9 push_front(x)

DataFrame前加入Vectorv.

12.3.10 push_front( x, name )

DataFrame前加入Vectorv,其列名为指定的“name”。

12.3.11 begin()

返回一个指向DataFrame第一列的迭代器。

12.3.12 end()

返回一个指向DataFrame最后一列的迭代器。

12.3.13 insert( it, v )

通过迭代器指定的位置,在DataFrame上加入 Vector v,返回一个指向该元素的迭代器。

12.3.14 erase(i)

删除 DataFramei列,返回指向该列后一列的迭代器。

12.3.15 erase(it)

删除 迭代器it所指向的DataFrame的列,返回指向该列后一列的迭代器。

###erase(first_i, last_i){#DF-erase-first-last-i}

删除first_ilast_i-1列,返回指向删除列后一列的迭代器。

12.3.16 erase(first_it, last_it)

删除first_itlast_it-1迭代器所指向的列,返回指向删除列后一列的迭代器。