ネストされた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.
が私のためにどのように動作していない、それは多分、別のケースをターゲットにしているようだが、私は何かが足りない。 refresによってリストの列を変更するための推奨される方法や柔軟な回避策はありますか?
私はエラーメッセージを理解したようそれは、あなたがしようとしていることが、(まだ)不可能であることを伝えています。その代わりに、j式で直接 ':='を使う必要があります –
':='をj式で直接使用する際の問題は、data.tableが最初にネストされていない場合にのみ可能です。 –
これはお勧めできません。あなたのテーブルを1つにスタックし、 'max'や他の一般的な要約関数に最適化された' by = '演算を行います... – Frank