2017-12-08 6 views
0

可能な複製はhereですが、それは私を助けません。私の場合はおそらく異なっている。ベクトルの1つの値だけで動作するdata.tableのjセクションに関数を適用します

サンプルのdata.tableを考えてみましょう。

set.seed(21) 
DT <- data.table(col1=sample(x=1:10,size = 5),col2=sample(x=10:20,size=5)) 
DT 
    col1 col2 
1: 8 20 
2: 3 11 
3: 6 19 
4: 2 17 
5: 10 15 

と機能checkを考える私は、各行に適用したい:私はDTjセクションの機能checkを呼び出し、参照することにより、この割り当てを実行する場合

check <- function(x,y) if ((y-x)>10) "A" else "B" 

は今、それは無残に失敗し、

DT[,state:=check(col1,col2)] 

そして、この警告をスロー

Warning message: 
In if ((y - x) > 10) "A" else "B" : 
    the condition has length > 1 and only the first element will be used 

はもちろん、私は一度にdata.tableプロセスというベクトル全体を推測し、機能は一つの値を必要とするので、私は最後の値はので、私は別の愚かな動きと思われ、この変更を行ったベクトルの現在の値であると思いました: - )

DT[,state:=check(last(col1),last(col2))] 

DT 

    col1 col2 state 
1: 8 20  B 
2: 3 11  B 
3: 6 19  B 
4: 2 17  B 
5: 10 15  B 

私はcheck()関数は最後の値のために計算され、すべての以前の値たびに上書きされた参照してください。私が望むのは、次の出力です。

DT 

    col1 col2 state 
1: 8 20  A 
2: 3 11  A 
3: 6 19  A 
4: 2 17  A 
5: 10 15  B 

したがって、各行のdata.tableで関数呼び出しを個別に行うにはどうすればよいですか? check()のような単純な条件のために正常に動作しますが、私はここでもう少し複雑な機能を持っている 私はifelseを使用する akrun から提案を受けた後、:

実際の機能。私が正しく理解しているのであればallowed_state

allowed_state <- function(old=NULL,new=NULL){ 
legalst<-data.table(from=c(1,1,9,9,7,8,7,10,10,11,11,10,11,8,7),to=c(11,7,10,7,8,7,9,9,7,1,7,1,7,9,10)) # all legal state transitions for a user 
if(new %in% legalst[from==old,to]) "Legal" else "Illegal state change" 

}

+0

かわり 'IF/else'すなわち' <チェックの 'ifelse'必要 - 関数(X、Yを)ifelse((yx)> 10、 "A"、 "B") ' – akrun

+0

実際、私の実際の関数' check'はifelseに変換するのは簡単ではありません。あなたがそれを変換する方法を提案できない限り。私の実際の機能を質問に加えてみましょう。 –

+0

これは役に立つかもしれない – akrun

答えて

関連する問題