在嵌套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