0

何千もの行と 3 つの異なる列を持つ r の配列があります。配列の各行について、最初の列と 3 番目の列に基づいて最初の列を変更したいと考えています。具体的には、3 列目の数値が 1 列目の数値よりも大きい場合は 1 を返し、3 列目の数値が 1 列目の数値よりも小さい場合は 0 を返す必要があります。ランダムに 1 または 0 を選択する必要があるのと同じ数です。

    temp[,1]<- sapply(
                        temp[,1],
                        function(score){
                           if(temp[,3]>score){1}
                           else if(temp[,3]<score){0}else
                           else if(temp[,3]==score){sample(0:1,1)}})

これは私がこれまでに持っているコードですが、うまく機能していません。「temp[,3]」を呼び出すと、3 番目の列にすべての行を含むベクトルが返されると思います。その行に 1 つのエントリが必要なだけです。 「スコア」で取得した行に対応します。

4

2 に答える 2

2

使用ifelse:

ifelse(temp[,1] < temp[,3], 1, # test condition 1, give 1 if TRUE
       ifelse(temp[,1] > temp[,3], 0, # condition 1 is FALSE, test condition 2
              rbinom(dim(temp)[1],1,.5))) # condition 2 is FALSE, return random

EDIT :ifelse条件をテストしてから、その条件TRUEFALSE3 つの条件があるため、最初の条件 ( temp[,1] < temp[,3]) がである場合の値を提供する代わりに、2 番目の条件をテストする 2FALSE番目のステートメントを提供します。ifelse(temp[,1] > temp[,3])

残りのすべてのケースは、 を使用してランダムに生成されrbinomます。これは描画ではなくベクトルでなければなりません。そうしないと、条件 1 と 2 を満たさないすべての行に同じランダム描画が与えられるためです。試してみると:

ifelse(temp[,1]<temp[,3],1,ifelse(temp[,1]>temp[,3],0,rbinom(1,1,.5)))

すべての行temp[,1]==temp[,3]の値が同じであることがわかります。次のようなことをするのと同じです:

ifelse(temp[,1]<temp[,3],1,ifelse(temp[,1]>temp[,3],0,2))
于 2013-07-01T15:44:57.710 に答える