6

私はこのコードを持っています:

dat<-dat[,list(colA,colB
                     ,RelativeIncome=Income/.SD[Nation=="America",Income]
                     ,RelativeIncomeLog2=log2(Income)-log2(.SD[Nation=="America",Income])) #Read 1)
               ,by=list(Name,Nation)]

1) と言いたいのです"RelativeIncomeLog2=log2(RelativeIncome)"が 、の範囲"RelativeIncome"では利用できませんか?j

2)代わりに次のことを試しました(data.table FAQに従って)。利用できるようになりまし"RelativeIncome"たが、列は追加されません:

     dat<-dat[,{colA;colB;RelativeIncome=Income/.SD[Nation=="America",Income];
               ,RelativeIncomeLog2=log2(RelativeIncome)])) 
               ,by=list(Name,Nation)]
4

1 に答える 1

9

でオブジェクトを作成して割り当てることができます。中かっこjを使用するだけです。{}

次に、これらのオブジェクト (またはオブジェクトの関数と計算) をj渡し、data.table の列として割り当てることができます。一度に複数の列を割り当てるには、次のようにします。

  • 名が文字列LHSであることを確認し、c(.)
  • の最後の行j(つまり、「戻り値」 ) はリストでなければなりません。

  dat[ , c("NewIncomeComlumn", "AnotherNewColumn") := { 
                 RelativeIncome     <- Income/.SD[Nation == "A", Income];   
                 RelativeIncomeLog2 <- log2(RelativeIncome);  
                 ## this last line is what will be asigned.
                 list(RelativeIncomeLog2 * 100,  c("A", "hello", "World"))
                 # assigned values are recycled as needed.
                 # If the recycling does not match up, a warning is issued. 
                }
                , by = list(Name, Nation)
               ]

jの環境内の関数として大まかに考えることができますdat

必要に応じて、より洗練された複雑なものを取得することもできます。byを使用して、引数を 組み込むこともできますby=list(<someName>=col)

実際、関数と同様に、 でオブジェクトを作成しjてそれに値を代入するだけでは、それが の外で使用できるようになるわけではありませんj。それを data.table に割り当てるには、それを返す必要があります。 j最後の行を自動的に返します。その最後の行がリストの場合、リストの各要素は列として扱われます。参照によって代入する (つまり、 を使用する:=) 場合は、期待どおりの結果が得られます。


別のメモとして、コードで次のことに気付きました。

 Income / .SD[Nation == "America", Income]

 # Which instead could simply be: 
 Income / Income[Nation == "America"]

.SD素晴らしい速記であるという点で素晴らしいです。ただし、カプセル化するすべての列を必要とせずに呼び出すと、コードに余分なメモリ コストがかかります。単一の列のみを使用している場合は、その列に明示的に名前を付けるか、.SDcols引数を ( の後にj) 追加して、そこで必要な列に名前を付けることを検討してください。

于 2013-05-12T19:36:53.847 に答える