0

R を使用していくつかの計算を行っていますが、3 つの変数を使用して if ステートメントを作成できるかどうか疑問に思っていました。

例えば:

for(d3 in unique(df2$V1))
    {
        for(d1 in 1:nrow(df1))
        {   
            for(d2 in 1:nrow(df2))
            {   
                if(df1[d1,]$V1 == df2[d2,]$V2 == d3)
                                    {

                oneV1 = subset(df2, V1==d3)
                minerrV2 =subset(oneV1,erV2==min(V2))       
                minerrV3 =subset(oneV1, erV3==min(V3))

                cverV2 = sum(df1$erV2 <= minerrV2$erV2)
                cverV3 = sum(df1$erV3 <= minerrV3$erV3)

                pV2 = cverV2/nrow(df1)
                pV3 = cverV3/nrow(df1)


    fres <- rbind(fres, data.frame(nV1=df1[d1,]$V1, nV4=df2[d2,]$V4, npV2=pV2,npV3=pV3 ))
                                     }
                         }
                }
        }

多くのifステートメントを作成する以外に、Rでこれを行う簡単な方法はありますか??

**EDIT**

これは、特別なパラメーターを使用したある種の順列テストです..これは、マージを使用して for ループよりも高速に実行できますか???

4

2 に答える 2

1
  • とは、比較における丸め誤差による「エラー」を回避するための要因であるdf2$V1べきですか?df2$V2df1$V1

  • 2 つ以上の変数を数値的に比較するには、を参照してください。? all.equal

    for(d3 in unique(df2$V1)) {
       tmp1 <- df1 [df1$V1 == d3,]
       tmp2 <- df2 [df2$V3 == d3,]
       outer (tmp1$x, tmp2$y, do.something) 
       ## OR:
       tmp1 <- which (df1$V1 == d3)
       tmp2 <- which (df2$V3 == d3)
       outer (tmp1, tmp2, do.something) 
    }
    

これらまたはアリのアプローチまたは、、、?tappyおよび、または...のいずれかが優れているかどうかは、あなた次第? aggregateです? split? mapplydo.something

于 2012-11-19T15:19:01.323 に答える
0

上記のジャスティンやその他のコメントに加えて、次のような方法でforループとif条件の使用を避けることができます。

bar = df2[! duplicated(df2$V1), ]
foo = merge(df1, df2, by.x = "V1", by.y = "V2", incomparables = NA)
foo = merger(foo, bar, by="V1", incomparables=NA)
for (i in seq(nrow(foo))) {
    ...
}

df1大きなテーブルの場合、この方法はとの各行の比較を避けるため、はるかに効率的だと思いますdf2

于 2012-11-19T14:55:49.687 に答える