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
を考える私は、各行に適用したい:私はDT
のj
セクションの機能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"
}
かわり 'IF/else'すなわち' <チェックの 'ifelse'必要 - 関数(X、Yを)ifelse((yx)> 10、 "A"、 "B") ' – akrun
実際、私の実際の関数' check'はifelseに変換するのは簡単ではありません。あなたがそれを変換する方法を提案できない限り。私の実際の機能を質問に加えてみましょう。 –
これは役に立つかもしれない – akrun