我的聚合需求因列/ data.frames而异.我想动态地将"list"参数传递给data.table.
作为一个最小的例子:
require(data.table)
type <- c(rep("hello", 3), rep("bye", 3), rep("ok",3))
a <- (rep(1:3, 3))
b <- runif(9)
c <- runif(9)
df <- data.frame(cbind(type, a, b, c), stringsAsFactors=F)
DT <-data.table(df)
Run Code Online (Sandbox Code Playgroud)
这个电话:
DT[, list(suma = sum(as.numeric(a)), meanb = mean(as.numeric(b)), minc = min(as.numeric(c))), by= type]
Run Code Online (Sandbox Code Playgroud)
会有类似的结果:
type suma meanb minc
1: hello 6 0.1332210 0.4265579
2: bye 6 0.5680839 0.2993667
3: ok 6 0.5694532 0.2069026
Run Code Online (Sandbox Code Playgroud)
未来的data.frames将有更多的列,我想要以不同的方式进行总结.但是为了使用这个小例子:有没有办法以编程方式传递列表?
我天真地尝试过:
# create a different list
mylist <- "list(lengtha = length(as.numeric(a)), maxb = max(as.numeric(b)), meanc = …Run Code Online (Sandbox Code Playgroud) 我需要在数据库(PostgreSQL 9.3.5)的许多表上运行相同的查询,并将表名作为参数传递给函数似乎是一件逻辑的事情。通过阅读文档中的示例和众多SO帖子,我仍然无法确定。
使用以下最小示例:
CREATE TABLE films (
code char(5),
kind varchar(10)
);
INSERT INTO films VALUES
('UA502', 'Comedy');
Run Code Online (Sandbox Code Playgroud)
而这个功能:
CREATE OR REPLACE FUNCTION foo(_t text)
RETURNS void AS -- I know, void is not what I am after
$func$
BEGIN
EXECUTE format('SELECT count(*) FROM %I', _t);
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
以下查询捕获了一些内容:
mydb=> SELECT foo('films');
foo
-----
(1 row)
Run Code Online (Sandbox Code Playgroud)
但是,因为我要检索表,所以我编辑第二行并重新创建该函数,如下所示:
CREATE OR REPLACE FUNCTION foo(_t text)
RETURNS TABLE(count integer) AS
$func$
BEGIN
EXECUTE format('SELECT count(*) FROM %I', _t);
END
$func$ LANGUAGE …Run Code Online (Sandbox Code Playgroud)