在嵌套data.table中使用data.tables的列表列時,很容易在該列上應用函數。例如:在嵌套data.table中通過引用修改list-column
dt<- data.table(mtcars)[, list(dt.mtcars = list(.SD)), by = gear]
我們可以使用:
dt[ ,list(length = nrow(dt.mtcars[[1]])), by = gear]
dt[ ,list(length = nrow(dt.mtcars[[1]])), by = gear]
gear length
1: 4 12
2: 3 15
3: 5 5
或
dt[, list(length = lapply(dt.mtcars, nrow)), by = gear]
gear length
1: 4 12
2: 3 15
3: 5 5
我想這樣做相同的處理,並使用操作:=
到每個數據通過參考應用的修改。列的表。
例子:
modify_by_ref<- function(d){
d[, max_hp:= max(hp)]
}
dt[, modify_by_ref(dt.mtcars[[1]]), by = gear]
返回錯誤:
Error in `[.data.table`(d, , `:=`(max_hp, max(hp))) :
.SD is locked. Using := in .SD's j is reserved for possible future use; a tortuously flexible way to modify by group. Use := in j directly to modify by group by reference.
錯誤消息使用尖端做到以任何方式對我來說不是工作,這似乎是針對另一起案件,但也許我錯過了一些東西。有沒有任何推薦的方法或靈活的解決方法,以通過refence修改列表列?
給定的表是:
我的理解錯誤信息,它告訴你正在嘗試做什麼是不可能的(但)。相反,你必須直接在你的j表達式中使用':=' –
直接在j表達式中使用':='的問題是,只有當data.table首先未被引用時纔有可能。 –
這通常不可取。將表格合併爲一個,並執行'by ='操作,這些操作已針對'max'和其他常用匯總功能進行了優化... – Frank