我正在使用data.table(版本1.9.6)编写自定义聚合函数,并且难以将函数参数传递给它。之前也有类似的问题,但没有一个处理多个(可变)输入并且没有一个确定的答案,而是“小技巧”。
我想对数据表进行求和和排序,并在顶部创建新变量(2步)。关键是一切都应该是参数化的,即要求和的变量,按哪些变量分组,按哪些变量排序。它们都可以是一个或多个变量。下面是一个小例子。
链接: 1.将变量和名称传递给data.table函数 2.data.table中的eval和quote 3.如何在R的data.table中完全通用地使用变量中的列名
如何以编程方式传递以下函数参数(即不是单个输入而是向量/输入列表):
我想对数据表进行求和和排序,并在顶部创建新变量(2步)。关键是一切都应该是参数化的,即要求和的变量,按哪些变量分组,按哪些变量排序。它们都可以是一个或多个变量。下面是一个小例子。
链接: 1.将变量和名称传递给data.table函数 2.data.table中的eval和quote 3.如何在R的data.table中完全通用地使用变量中的列名
dt <- data.table(a=rep(letters[1:4], 5),
b=rep(letters[5:8], 5),
c=rep(letters[3:6], 5),
x=sample(1:100, 20),
y=sample(1:100, 20),
z=sample(1:100, 20))
temp <-
dt[, .(x_sum = sum(x, na.rm = T),
y_sum = sum(y, na.rm = T)),
by = .(a, b)][order(a, b)]
temp2 <-
temp[, `:=` (x_sum_del = (x_sum - shift(x = x_sum, n = 1, type = "lag")),
y_sum_del = (y_sum - shift(x = y_sum, n = 1, type = "lag")),
x_sum_del_rel = ((x_sum - shift(x = x_sum, n = 1, type = "lag")) /
(shift(x = x_sum, n = 1, type = "lag"))),
y_sum_del_rel = ((y_sum - shift(x = y_sum, n = 1, type = "lag")) /
(shift(x = y_sum, n = 1, type = "lag")))
)
]
如何以编程方式传递以下函数参数(即不是单个输入而是向量/输入列表):
- x和y --> var_list
- x和y的新名称(例如x_sum,y_sum)--> var_name_list
- 按参数a,b分组 --> by_var_list
- 按参数a,b排序 --> order_var_list
- temp 2应该适用于所有预定义参数,我也考虑使用apply函数,但再次无法传递变量列表。
我已经尝试了get(),as.name(),eval(),quote()的变化,但一旦我传递多个变量,它们就不再起作用。 我希望问题很清楚,否则我很乐意在您认为必要的地方进行调整。 函数调用如下:
fn_agg(dt, var_list, var_name_list, by_var_list, order_var_list)