私は大きなdata.tableのエキスパートではありませんが、私は何とか何とか困惑しています。ここに私の簡単な例です:名前が文字ベクトルに格納されたdata.table変数を持つ関数
test<-data.table(x= 1:10,y= 1:10,z= 1:10, l = 11:20,d= 21:30)
test<-test[,..I:=.I]
vec_of_names = c("z","l","d")
function_test<-function(x,y){
sum(x)+y
}
vec_of_final_names<-c("sum_z","sum_l","sum_d")
私は、このような何かを行うしようとすると:
for (i in 1:length(vec_of_names)){
test<-test[,vec_of_final_names[i]:=function_test(x=.SD,y=eval(parse(text=vec_of_names[i]))),.SDcols=c("x","y"),by=..I]
}
私はエラーを取得する:
Error in eval(expr, envir, enclos) : object 'z' not found
以下のコードは完全に正常に動作しますが、あるのに対し少し醜いとまた遅い。誰かがより良い選択肢を提案するかもしれない。 = ..I
によってグループ化され.SDcols
とを指定した後
for (i in 1:length(vec_of_names)){
test<-test[,vec_of_final_names[i]:=function_test(x=eval(parse(text=paste("c(",paste(c("x","y"),collapse=","),")",sep=""))),y=eval(parse(text=vec_of_names[i]))),by=..I]
}
を指定してなくて感謝をも行うことができますメインポストで修正されました – Vitalijs
私の意見では、それはあなたの関数、またはおそらくあなたのデータ構造体ですure、それはここでの問題です。 DTがdata.frame、data.table、またはベクトルのリストの場合、 'sum(DT)'はしないでください。行単位の操作を行うことは、アプローチが誤っている可能性があるもう一つの赤い旗です。あなたがしなければならないようです... 'm = as.matrix(test [、1:5、with = FALSE]); m%*%rbind(1,1、diag(3)) 'などとなります。 – Frank
これは単なる例です。そのアイデアはもっとありました。あなたが膨大な量の変数をいくつかのベクトルに格納しているとします。これはあなたの関数ではxになります。次に、別のベクトルに格納されているyを反復処理したい場合は、それをきれいに行うには – Vitalijs