[英]R data.table using lapply on functions defined outside
此问题与R-将固定列传递给data.table中的lapply函数有关,并且按组和列进行加权均值 ,但有所不同。
我想要一个固定的列与data.table
所有其他列进行data.table
。 一个简单的例子来说明:
DT <- data.table(y = rnorm(10), x1 = rnorm(10), x2 = rnorm(10))
DT[, lapply(c('x1', 'x2'), function(x) get(x) * y)]
现在假设该操作比乘法复杂得多,因此我想在data.table
范围之外定义一个独立函数:
fun <- function(x) {
return(get(x) * y)
}
DT[, lapply(c('x1', 'x2'), fun)]
Error in get(x) : object 'x1' not found
显然,变量范围存在问题,因为在data.table
外部定义的函数看不到内部的变量。 是否有任何巧妙的技巧可以在data.table
之外定义函数,并且仍然可以使用lapply
?
如果您尝试通过字符串和命名变量组合引用,则将自己打结。 (以及通过引用函数中的“全局”变量)
最简单的方法是定义get
在哪里寻找x
(和y
)
这是重写的函数,因此您可以告诉它在哪里看。
fun <- function(x,y,wherex=parent.frame(),wherey=parent.frame()) {
return(get(x,wherex) * get(y,wherey))
}
data.table
检查存在于j
的名称,并且仅在必需的列中加载。
在您的示例中,您没有使用列名,因此没有可用的列。
如果在j
的表达式中包括.SD
,它将在所有列中加载。 您可以将.SD
用作新定义的fun
的wherex
/ wherey
参数
DT[, lapply(c('x1', 'x2'), fun, y = 'y' , wherex=.SD, wherey=.SD)]
# V1 V2
# 1: -0.27871200 1.1943170
# 2: -0.68843421 -1.5719016
# 3: 1.06968681 2.8358612
# 4: 0.21201412 1.0127712
# 5: 0.05392450 0.2487873
# 6: 0.04473767 -0.1644542
# 7: 5.37851536 2.9710708
# 8: 0.23653388 0.9506559
# 9: 1.96364756 -1.4662968
# 10: -0.02458077 -0.1197023
请注意,您实际上并不需要将其包装在[.data.table
results <- setDT(lapply(c('x1','x2'), fun, y='y', wherex=DT,wherey=DT))
将返回相同的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.