我想將使用Rpostgresql的成功R代碼轉換爲PL/R代碼,以避免將數據推入/移出postgreql數據庫。將R代碼推送到postgresql數據庫中的PL/R代碼
代碼是在data.table一個dcast:R中
#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)
代碼工作正常&快。
現在我試圖把代碼放在一個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
更改數據幀的data.table(as.data.frame(cli_ranges.pivoted)
)也不起作用。
一個技巧可能是爲了執行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
... ... ...
後dcast(即樞轉)datafram是如下:
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
昌不同值的數量通常情況下,所以我可以預先定義旋轉後的列數。
信封:在PostgreSQL 9.5,R 3.3,PL/R 08.03.00.16,贏得10 64位
問題是,'prod_ranges'的數量會隨着時間而改變,也就是說我無法定義'dcast'會產生多少列(我的表是通過'prod_ranges'值轉置的) – ant1j
您能舉一個例子嗎?你對dcast或輸出的輸入(填入假數字等)? – DDrake
原始問題中提供的插圖 – ant1j