如何将特定于列的参数传递给data.table .SD中的lapply?

时间:2018-08-26 02:15:09

标签: r data.table parameter-passing lapply mapply

我看到了在.SD中将lapplydata.table一起使用的示例,其功能如下:

DT[ , .(b,d,e) := lapply(.SD, tan), .SDcols = .(b,d,e)]

但是我不确定如何在多参数函数中使用特定于列的参数。例如,我有一个winsorize函数,我想将其应用于数据表中列的子集,但要使用列特定的百分位数,例如

library(DescTools)
wlevel <- list(b=list(lower=0.01,upper=0.99), c=list(upper=0.02,upper=0.95))
DT[ , .(b,c) :=lapply(.SD, function(x) 
{winsorize(x,wlevel$zzz$lower,wlevel$zzz$upper)}), .SDcols = .(b,c)]

zzz将是要迭代的相应列。我还看到了在lapply上使用更改参数的线程,但在.SDcols的数据表上下文中没有使用

这可能吗?

这是一个玩具示例,旨在概括任意数量的列的情况;循环始终是一种选择,但尝试查看是否有更优雅/有效的解决方案...

1 个答案:

答案 0 :(得分:1)

  

如何在多参数函数中使用特定于列的参数?

使用mapply(FUN, dat, params1, params2, ...),其中Transformer可以是列表或向量; params1, params2, ...并行遍历mapply的每一个。

请注意,与dat, params1, params2, ...系列的其余部分不同,对于apply/lapply/sapply,函数参数是第一个出现的,然后是数据和参数。

在您的情况下(伪代码,您需要对其进行调整才能使其运行),例如:

与其嵌套列表mapply相比,解包可能更容易:

wlevel  <- list(b=list(lower=0.01,upper=0.99), c=list(upper=0.02,upper=0.95))

在为列表建立索引时,我们不需要使用列名(您的w_lower <- list(b=0.01, c=0.02) w_upper <- list(b=0.99, c=0.95) DT[ , c('b','c') := mapply(function(x, w_lower_col, w_upper_col) { winsorize(x, w_lower_col, w_upper_col) }, .SD, w_lower, w_upper), .SDcols = c('b', 'c')] ),zzz应该照原样遍历列表。