トップ
新規
一覧
単語検索
最終更新
ヘルプ
ログイン
アールメカブ
hidden_R_Cソースでデータフレームを生成
をテンプレートにして作成
開始行:
[[Rの備忘録]]
もっと簡単な方法もありそうな気がするんだが
/*
// R-2.6.0/src/library/Recommended/foreign/src/Rdbfread.c...
// R CMD SHLIB data_frame_make.c -L/usr/local/lib/
*/
#include <R.h>
#include <Rinternals.h>
SEXP dfmake(){
int pc=0;
SEXP df, varlabels, tmp, row_names;
// ベクトル要素(列)を二つ持つ data.frame を用意
PROTECT(df = allocVector(VECSXP, 2));
// ベクトル要素を二つ持つ data.frame
pc++;
// df 第一列のベクトルは三つの要素(行)からなる 文字ベク...
SET_VECTOR_ELT(df, 0, allocVector(STRSXP, 3));
// その単純な初期化 列番号,行番号,文字列
SET_VECTOR_ELT(VECTOR_ELT(df,0), 0, mkChar("山田"));
SET_VECTOR_ELT(VECTOR_ELT(df,0), 1, mkChar("加藤"));
SET_VECTOR_ELT(VECTOR_ELT(df,0), 2, mkChar("佐藤"));
// df 第二列のベクトルは三つの要素(行)からなる 整数ベク...
SET_VECTOR_ELT(df, 1, allocVector(INTSXP, 3));
// その単純な初期化,列番号[行番号]
INTEGER(VECTOR_ELT(df,1))[0] = 10;
INTEGER(VECTOR_ELT(df,1))[1] = 20;
INTEGER(VECTOR_ELT(df,1))[2] = 30;
//df の各列ベクトルの名前を用意
PROTECT(varlabels = allocVector(STRSXP, 2));
pc++;
// 列名の単純な初期化 列番号,文字列
SET_STRING_ELT(varlabels, 0, mkChar("Term"));
SET_STRING_ELT(varlabels, 1, mkChar("Freq"));
// オブジェクトはデータフレームだと指定する
PROTECT(tmp = mkString("data.frame"));
pc++;
// 行名を指定.必須
PROTECT(row_names = allocVector(STRSXP, 3));
pc++;
// 行名の単純な初期化 行番号,文字列
SET_STRING_ELT(row_names, 0, mkChar("1"));
SET_STRING_ELT(row_names, 1, mkChar("2"));
SET_STRING_ELT(row_names, 2, mkChar("3"));
// あるいはこうする
/* char labelbuff[3];
for (i = 0; i <= 3 ; i++) {
sprintf(labelbuff, "%d", i+1);
SET_STRING_ELT(row_names, i, mkChar(labelbuff));
}
*/
// データフレームオブジェクト df の属性設定
setAttrib(df, R_ClassSymbol, tmp);
setAttrib(df, R_NamesSymbol, varlabels);
setAttrib(df, R_RowNamesSymbol, row_names);
UNPROTECT(pc);
return(df);
}
終了行:
[[Rの備忘録]]
もっと簡単な方法もありそうな気がするんだが
/*
// R-2.6.0/src/library/Recommended/foreign/src/Rdbfread.c...
// R CMD SHLIB data_frame_make.c -L/usr/local/lib/
*/
#include <R.h>
#include <Rinternals.h>
SEXP dfmake(){
int pc=0;
SEXP df, varlabels, tmp, row_names;
// ベクトル要素(列)を二つ持つ data.frame を用意
PROTECT(df = allocVector(VECSXP, 2));
// ベクトル要素を二つ持つ data.frame
pc++;
// df 第一列のベクトルは三つの要素(行)からなる 文字ベク...
SET_VECTOR_ELT(df, 0, allocVector(STRSXP, 3));
// その単純な初期化 列番号,行番号,文字列
SET_VECTOR_ELT(VECTOR_ELT(df,0), 0, mkChar("山田"));
SET_VECTOR_ELT(VECTOR_ELT(df,0), 1, mkChar("加藤"));
SET_VECTOR_ELT(VECTOR_ELT(df,0), 2, mkChar("佐藤"));
// df 第二列のベクトルは三つの要素(行)からなる 整数ベク...
SET_VECTOR_ELT(df, 1, allocVector(INTSXP, 3));
// その単純な初期化,列番号[行番号]
INTEGER(VECTOR_ELT(df,1))[0] = 10;
INTEGER(VECTOR_ELT(df,1))[1] = 20;
INTEGER(VECTOR_ELT(df,1))[2] = 30;
//df の各列ベクトルの名前を用意
PROTECT(varlabels = allocVector(STRSXP, 2));
pc++;
// 列名の単純な初期化 列番号,文字列
SET_STRING_ELT(varlabels, 0, mkChar("Term"));
SET_STRING_ELT(varlabels, 1, mkChar("Freq"));
// オブジェクトはデータフレームだと指定する
PROTECT(tmp = mkString("data.frame"));
pc++;
// 行名を指定.必須
PROTECT(row_names = allocVector(STRSXP, 3));
pc++;
// 行名の単純な初期化 行番号,文字列
SET_STRING_ELT(row_names, 0, mkChar("1"));
SET_STRING_ELT(row_names, 1, mkChar("2"));
SET_STRING_ELT(row_names, 2, mkChar("3"));
// あるいはこうする
/* char labelbuff[3];
for (i = 0; i <= 3 ; i++) {
sprintf(labelbuff, "%d", i+1);
SET_STRING_ELT(row_names, i, mkChar(labelbuff));
}
*/
// データフレームオブジェクト df の属性設定
setAttrib(df, R_ClassSymbol, tmp);
setAttrib(df, R_NamesSymbol, varlabels);
setAttrib(df, R_RowNamesSymbol, row_names);
UNPROTECT(pc);
return(df);
}
ページ名: