Rpostgresqlを使用してRコードをPL/Rコードに変換しようとしていますが、postgreqlデータベースにデータをプッシュ/プルしないようにしています。postgresqlデータベースのPL/RコードにRコードをプッシュ
コードdata.tableにdcastさ:
#libs
library(RPostgreSQL);
library(data.table);
# connect
drv <- dbDriver("PostgreSQL");
con <- dbConnect(drv, dbname="postgres", user="postgres");
# load
cli_ranges <- dbGetQuery(con, "SELECT custid, prod_ranges, is_cli from cli_ranges;")
# DT
setDT(cli_ranges)
setkeyv(cli_ranges , c("prod_ranges"))
# pivot
cli_ranges.pivoted <- dcast(cli_ranges, custid ~ paste0("is_cli_", prod_ranges), fun=sum, value.var = "is_cli")
# send back to DB
dbWriteTable(con, "cli_ranges_pivoted", cli_ranges.pivoted, row.names=F)
コードRでは、高速&正常に動作しています。
私は今、PL/R機能にコードをプッシュしようとしています、
CREATE OR REPLACE FUNCTION public.pivot()
RETURNS void AS
$BODY$
[copy/paste R code]
$BODY$
LANGUAGE plr;
...しかし、Rコード(dbWriteTable
)の最後の行はスロー:
ERROR: R interpreter expression evaluation error
DETAIL: Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function 'dbWriteTable' for signature '"logical", "character", "data.frame"'
CONTEXT: In PL/R function pivot
変更データフレーム(as.data.frame(cli_ranges.pivoted)
)へのdata.tableも機能しません。 ...
1つのトリックはCREATE TABLE cli_ranges_pivoted AS SELECT pivot();
を実行するためにdata.table /フレームを返すようにすることでしたが、私は実際に出力としてdata.frameをプッシュする方法がわからない
cli_ranges
表:
custid prod_ranges is_cli
1 A 1
1 B 1
1 C 0
2 A 1
2 B 0
2 C 1
3 A 0
3 B 1
3 C 0
4 A 1
... ... ...
は以下の通りである:
custid prod_ranges_A prod_ranges_B prod_ranges_C
1 1 1 0
2 1 0 1
3 0 1 0
4 1 ...
...
prod_ranges
チャンにおける個別値の数多くの場合、旋回後の列数をあらかじめ定義することができます。
ENV:Postgresqlの9.5、R 3.3、PL/R 08.03.00.16、10勝64-ビット
問題は 'prod_ranges'の数が時間の経過と共に変化することです。つまり、' prod_ranges'値にテーブルを転記する 'dcast'の結果の列数を定義できません。 – ant1j
dcastや出力へのあなたの入力(偽の数字を記入するなど)? – DDrake
イラストは元の質問 – ant1j