2017-10-09 14 views
0

ネストされた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によってリストの列を変更するための推奨される方法や柔軟な回避策はありますか?

+0

私はエラーメッセージを理解したようそれは、あなたがしようとしていることが、(まだ)不可能であることを伝えています。その代わりに、j式で直接 ':='を使う必要があります –

+0

':='をj式で直接使用する際の問題は、data.tableが最初にネストされていない場合にのみ可能です。 –

+3

これはお勧めできません。あなたのテーブルを1つにスタックし、 'max'や他の一般的な要約関数に最適化された' by = '演算を行います... – Frank

答えて

1

これは、2つのステップを以下にまたはシングル・ステップで行うことができます

与えられたテーブルがある:

dt<- data.table(mtcars)[, list(dt.mtcars = list(.SD)), by = gear] 

ステップ1 - の列のリストにdt

の各行の hpベクトルを追加してみましょう
dt[, hp_vector := .(list(dt.mtcars[[1]][, hp])), by = list(gear)] 

ステップ2 - 最大値を計算するhp

dt[, max_hp := max(hp_vector[[1]]), by = list(gear)] 

与えられたテーブルがある:

dt<- data.table(mtcars)[, list(dt.mtcars = list(.SD)), by = gear] 

シングルステップ - シングルステップは実際には、上記の手順の両方の組み合わせである:

dt[, max_hp := .(list(max(dt.mtcars[[1]][, hp])[[1]])), by = list(gear)] 

我々がでネストされたテーブル内の値を移入する場合それでは、警告メッセージを無視する必要があるだけで、それを行う方法については、次のリンクを参照してください。誰かが警告メッセージを修正する方法を教えてくれる場合や、落とし穴がある場合は、私は満足しています。詳細については、リンクを参照してください:

https://stackoverflow.com/questions/48306010/how-can-i-do-fast-advance-data-manipulation-in-nested-data-table-data-table-wi/48412406#48412406 

私は与えられたデータセットについてここでそれを行う方法を示すつもりです。

てみましょう最初のクリーンすべて:

rm(list = ls()) 

レッツ・別の方法で再定義し、指定された表:私は少し異なるテーブルを定義している

dt<- data.table(mtcars)[, list(dt.mtcars = list(data.table(.SD))), by = list(gear)] 

注意を。私はdata.tableを上記の定義に加えて使用しました。

次に、ネストした表内参照によって最大に移入:

dt[, dt.mtcars := .(list(dt.mtcars[[1]][, max_hp := max(hp)])), by = list(gear)] 

をそして、私たちは、ネストされたテーブル内の操作を行うことができます何が良いものを期待することができます。

dt[, dt.mtcars := .(list(dt.mtcars[[1]][, weighted_hp_carb := max_hp*carb])), by = list(gear)] 
+0

詳しいチュートリアルをありがとうございますが、あなたの解は実際に問題に対処していません。 dtに新しい列が作成されますが、目的の出力は各ネストされたdata.tableの新しい列*になります。 (他のユーザーからのコメントはまだありません) –

+0

違いを見るには、関数が実際に注入であり、要約ではない場合(ex:new_hp = hp + 1)を考えてみましょう。 –

+0

実際には、それは私が詳細をリンクを参照するように指摘した理由です。とにかく、ネストされたテーブルにmax_hpを追加する方法は次のとおりです(私は自分の答えを更新しました)。また、私たちは操作を行うことができます。あなたがそれを使うという落とし穴を見つけ出すことができたら教えてください。 –

関連する問題