我看到了在.SD
中将lapply
与data.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
的数据表上下文中没有使用
这可能吗?
这是一个玩具示例,旨在概括任意数量的列的情况;循环始终是一种选择,但尝试查看是否有更优雅/有效的解决方案...
答案 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
应该照原样遍历列表。