簡體   English   中英

R data.table在外部定義的函數上使用lapply

[英]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用作新定義的funwherex / 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM