2016-09-02 6 views
-1

私は大きな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] 
} 
+0

を指定してなくて感謝をも行うことができますメインポストで修正されました – Vitalijs

+1

私の意見では、それはあなたの関数、またはおそらくあなたのデータ構造体ですure、それはここでの問題です。 DTがdata.frame、data.table、またはベクトルのリストの場合、 'sum(DT)'はしないでください。行単位の操作を行うことは、アプローチが誤っている可能性があるもう一つの赤い旗です。あなたがしなければならないようです... 'm = as.matrix(test [、1:5、with = FALSE]); m%*%rbind(1,1、diag(3)) 'などとなります。 – Frank

+0

これは単なる例です。そのアイデアはもっとありました。あなたが膨大な量の変数をいくつかのベクトルに格納しているとします。これはあなたの関数ではxになります。次に、別のベクトルに格納されているyを反復処理したい場合は、それをきれいに行うには – Vitalijs

答えて

2

..Iは、列名の奇妙な名前です)、私たちはsumを取得し、.SDunlistmgetlistの「vec_o​​f_names」の値を取得「vec_o​​f_final_names」を作成するために、新しい列にそれを、sum(unlist(.SD))とこれの対応する要素の+を行うと、(:=)を割り当てる

test[, (vec_of_final_names) := Map(`+`, sum(unlist(.SD)), 
        mget(vec_of_names)), by = ..I, .SDcols = x:y] 

例に基づいて、これは、グループ化変数

test[, (vec_of_final_names) := Map(`+`, list(x+y), mget(vec_of_names))] 

それとも.SDcols

test[, (vec_of_final_names) := Map(`+`, list(Reduce(`+`, .SD)), 
          mget(vec_of_names)), .SDcols = x:y] 

またはOPの機能を使用して

test[, (vec_of_final_names) := Map(function_test, list(unlist(.SD)), 
       mget(vec_of_names)), ..I, .SDcols = x:y] 
test 
#  x y z l d ..I sum_z sum_l sum_d 
# 1: 1 1 1 11 21 1  3 13 23 
# 2: 2 2 2 12 22 2  6 16 26 
# 3: 3 3 3 13 23 3  9 19 29 
# 4: 4 4 4 14 24 4 12 22 32 
# 5: 5 5 5 15 25 5 15 25 35 
# 6: 6 6 6 16 26 6 18 28 38 
# 7: 7 7 7 17 27 7 21 31 41 
# 8: 8 8 8 18 28 8 24 34 44 
# 9: 9 9 9 19 29 9 27 37 47 
#10: 10 10 10 20 30 10 30 40 50 
+0

それはどんな関数でも、基本的に私の主張は、.SDに多くの変数を指定して、yのすべての変数に対して繰り返したいということです。これはfunction_test(x =。SD、y = vec [i]) – Vitalijs

+0

@VitalijsJascisens私はあなたの関数を使用して更新を確認してください – akrun

+0

ありがとう、それは動作しているようですが、まだそれはまだ遅い理由が少し不明です – Vitalijs

関連する問題