【问题标题】:R data.table, namespace for user defined function in JR data.table,J 中用户定义函数的命名空间
【发布时间】:2015-12-01 10:41:24
【问题描述】:

我有一个如下所示的数据表。我想计算每个市场的回报与每个信号的相关性。

dt = data.table(mkt = rep(letters[1:3], each = 3), rtn = rnorm(9), signal1=rnorm(9), signal2=rnorm(9), signal3 = rnorm(9))
   mkt      rtn    signal1     signal2    signal3
1:   a  0.2488643  0.4110516 -0.04861252 -1.3599824
2:   a  1.3387256 -0.4418436 -0.17055841 -1.2161698
3:   a -1.4058236 -1.2624645 -0.24315048 -1.2722546
4:   b  1.7056606  0.2618591  2.60779232  0.7786226
5:   b  0.7913587 -1.0596116  0.31152541  1.7336651
6:   b -1.8690651  0.1942825  0.95430075 -0.7030462
7:   c -0.4937575 -1.8645226 -0.32312077 -1.7138482
8:   c -0.7153342 -0.5142624 -0.43817789 -1.3637261
9:   c  0.3766730 -0.0954339  0.71159756 -1.2118075

dt[, lapply(.SD, function(x) cor(x, rtn, use = 'c')), .SDcols = 3:5, by = mkt]
Error in is.data.frame(y) : object 'rtn' not found

如何让 J 中的匿名函数知道 rtn 列?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我认为一种方法是将它包含在.SDcols 中,以便匿名函数能够找到rtn,然后可能会删除rtn 列(因为它只有1 作为值,因为这将是与自身的相关性):

    dt[, lapply(.SD, function(x) cor(x, rtn, use = 'c')), .SDcols = c(2, 3:5), by = mkt]
    
       mkt rtn    signal1    signal2    signal3
    1:   a   1  0.6759421 -0.5037837  0.8605805
    2:   b   1 -0.8494135  0.6720274  0.7832928
    3:   c   1 -0.9425291  0.5683629 -0.9976231
    

    然后你可以这样做:

    dt2 <- dt[, lapply(.SD, function(x) cor(x, rtn, use = 'c')), .SDcols = c(2, 3:5), by = mkt]
    dt2[, rtn := NULL]
    dt2
    #   mkt    signal1    signal2    signal3
    #1:   a  0.6759421 -0.5037837  0.8605805
    #2:   b -0.8494135  0.6720274  0.7832928
    #3:   c -0.9425291  0.5683629 -0.9976231
    

    【讨论】:

    • 刚刚发现cor 是矢量化的,所以不需要lapply。只需 cor(.SD, rtn, use='C') 工作,但仍需要 rtn in .SDcols
    猜你喜欢
    • 1970-01-01
    • 2019-09-03
    • 2012-01-20
    • 1970-01-01
    • 2012-09-26
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多